第三方登录框架JustAuth入门使用和源码分析
项目介绍
-
JustAuth
,如你所见,它仅仅是一个第三方授权登录的工具类库,它可以让我们脱离繁琐的第三方登录 SDK,让登录变得So easy! -
JustAuth
集成了诸如:Github、Gitee、支付宝、新浪微博、微信、Google、Facebook、Twitter、StackOverflow等国内外数十家第三方平台。
项目地址
- https://gitee.com/yadong.zhang/JustAuth
快速入门
- 添加依赖
<dependency>
<groupId>com.xkcoding.justauth</groupId>
<artifactId>justauth-spring-boot-starter</artifactId>
<version>1.4.0</version>
</dependency>
- 添加发起跳转第三方授权的接口和回调接口
@Slf4j
@RestController
@RequestMapping("/oauth")
public class AuthController {
@Autowired
private AuthRequestFactory factory;
@GetMapping
public List<String> list() {
return factory.oauthList();
}
@GetMapping("/{type}/login")
public void login(@PathVariable String type, HttpServletResponse response) throws IOException {
AuthRequest authRequest = factory.get(type);
response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
}
@GetMapping("/{type}/callback")
public AuthResponse login(@PathVariable String type, AuthCallback callback) {
AuthRequest authRequest = factory.get(type);
AuthResponse response = authRequest.login(callback);
log.info("【response】= {}", response.toString());
return response;
}
}
- 配置文件中添加授权服务器的client_id,client_secret,redirect_url
server:
port: 9981
justauth:
enabled: true
type:
GITEE:
client-id: ca219728...
client-secret: 48a09e42...
redirect-uri: http://127.0.0.1:9981/oauth/gitee/callback #项目中的回调地址
cache:
type: default
源码分析
-
JustAuth
帮助登录第三方框架,分为两个步骤,第一是获取授权码,第二是根据授权码获取token,从而获取用户信息。 -
JustAuth
在oauth协议中,主要扮演的是第三方应用程序。 需要在授权服务器上申请client_id和client_secret,在验证的时候需要获取到授权码code,然后拿到授权码换accesstoken,最后获取到资源服务器上的资源。详细流程可以看我以前写的这篇博客:Ouath协议流程详解。
跳转授权服务器
- 浏览器输入http://localhost:9981/oauth/gitee/login,核心逻辑就是进行字符串的拼接,
AuthDefaultRequest#authorize()
,将client_id、client_secret和response_type拼接在一起,重定向到授权服务器。
@GetMapping("/{type}/login")
public void login(@PathVariable String type, HttpServletResponse response) throws IOException {
AuthRequest authRequest = factory.get(type);
response.sendRedirect(authRequest.authorize(AuthStateUtils.createState()));
}
会跳转到gitee的登录页面。
- 授权服务器登录,并进行授权,意味着验证完成,会重定向到redirect_url上,并且带有授权code参数。
http://127.0.0.1:9981/oauth/gitee/callback?code=xxx
根据授权码获取用户信息
@GetMapping("/{type}/callback")
public AuthResponse login(@PathVariable String type, AuthCallback callback) {
AuthRequest authRequest = factory.get(type);
AuthResponse response = authRequest.login(callback);
log.info("【response】= {}", response.toString());
return response;
}
AuthRequest
的login方法,主要做了两件事,根据授权码获取token,还有根据token获取用户信息。
public AuthResponse login(AuthCallback authCallback) {
try {
AuthChecker.checkCode(this.source, authCallback);
if (!this.config.isIgnoreCheckState()) {
AuthChecker.checkState(authCallback.getState(), this.source, this.authStateCache);
}
AuthToken authToken = this.getAccessToken(authCallback);
AuthUser user = this.getUserInfo(authToken);
return AuthResponse.builder().code(AuthResponseStatus.SUCCESS.getCode()).data(user).build();
} catch (Exception var4) {
Log.error("Failed to login with oauth authorization.", var4);
return this.responseError(var4);
}
}
用授权码发起获取token的请求:
https://gitee.com/oauth/token?code=xxx&client_id=aaa&client_secret=bbb&grant_type=authorization_code&redirect_uri=http://127.0.0.1:9981/oauth/gitee/callback
用access_token获取用户信息:https://gitee.com/api/v5/user?access_token=xxx