社交短信登录原理

社交短信登录流程图

验证码校验

验证码统一处理

验证码校验统一在网关上处理,此处比较和验证码下发的 code 是否一致。

验证码校验流程

接受前端 /auth/oauth/token 请求处理,注意这里是 Spring Security OAuth2 来接管这个请求。

登录请求处理流程
扩展登录方式

mobile 字段比较特殊,格式为"登录方式@标识",这意味着可以支持 WX@OPEN_CODE 这种形式从而实现了三方登录。mobile 模式为扩展的支持短信和三方登录的实现模式。

请求说明:

  • 请求 URL 和密码登录一样
  • mobile 字段比较特殊,为登录方式@标识
  • mobile 模式为扩展的支持短信和三方登录的实现模式

根据请求参数构建认证实体

构建认证实体流程

Spring Security 认证过程实现

public class CustomAppAuthenticationProvider extends AbstractUserDetailsAuthenticationProvider {

	@Override
	public Authentication authenticate(Authentication authentication) throws AuthenticationException {

            ...
        // 获取 PigxUserDetailsService
        PigxUserDetailsService optional = null
		// 手机号
		String phone = authentication.getName();
		UserDetails userDetails = optional.get().loadUserByUsername(phone);

		// userDeails 校验
		preAuthenticationChecks.check(userDetails);

		CustomAppAuthenticationToken token = new CustomAppAuthenticationToken(userDetails);
		token.setDetails(authentication.getDetails());
		return token;
	}

}

UserDetailsService 调用 Feign 查询用户信息

入参格式注意

特别注意此处入参格式为:TYPE@XXX

Feign 查询用户信息

匹配用户信息处理器查询

用户信息处理器匹配

处理流程:

  • 截取认证方式,比如 SMS、WX
  • 通过方式去匹配对应的实现
处理器自动注入

loginHandlerMap 是 Spring 自动注入的,key 为 bean 名称,value 为 bean 实现类。

处理器匹配实现