如何使用

在前面有介绍到,JustAuth的特点之一就是,极简主义,不给使用者造成不必要的障碍。

既然牛皮吹下了, 那么如何才能用JustAuth实现第三方登录呢?

使用步骤

使用JustAuth总共分三步(这三步也适合于JustAuth支持的任何一个平台):

  • 申请注册第三方平台的开发者账号
  • 创建第三方平台的应用,获取配置信息(accessKey, secretKey, redirectUri)
  • 使用该工具实现授权登陆

使用方式

  • 引入依赖
  1. <dependency>
  2. <groupId>me.zhyd.oauth</groupId>
  3. <artifactId>JustAuth</artifactId>
  4. <version>${latest.version}</version>
  5. </dependency>
  • 调用api
  1. // 创建授权request
  2. AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
  3. .clientId("clientId")
  4. .clientSecret("clientSecret")
  5. .redirectUri("redirectUri")
  6. .build());
  7. // 生成授权页面
  8. authRequest.authorize("state");
  9. // 授权登录后会返回code(auth_code(仅限支付宝))、state,1.8.0版本后,可以用AuthCallback类作为回调接口的参数
  10. // 注:JustAuth默认保存state的时效为3分钟,3分钟内未使用则会自动清除过期的state
  11. authRequest.login(callback);

API分解

JustAuth的核心就是一个个的request,每个平台都对应一个具体的request类,所以在使用之前,需要就具体的授权平台创建响应的request

  1. // 创建授权request
  2. AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
  3. .clientId("clientId")
  4. .clientSecret("clientSecret")
  5. .redirectUri("redirectUri")
  6. .build());

所有可用的Request列表请参考:已集成的平台

获取授权链接

  1. String authorizeUrl = authRequest.authorize("state");

获取到authorizeUrl后,可以手动实现redirect到authorizeUrl

伪代码

  1. /**
  2. *
  3. * @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
  4. */
  5. @RequestMapping("/render/{source}")
  6. public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {
  7. AuthRequest authRequest = getAuthRequest(source);
  8. String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
  9. response.sendRedirect(authorizeUrl);
  10. }

注:state建议必传!stateOAuth的流程中的主要作用就是保证请求完整性,防止CSRF风险,此处传的state将在回调时传回

登录(获取用户信息)

  1. AuthResponse response = authRequest.login(callback);

授权登录后会返回code(auth_code(仅限支付宝)、authorization_code(仅限华为))、state,1.8.0版本后,用AuthCallback类作为回调接口的入参

伪代码

  1. /**
  2. *
  3. * @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
  4. */
  5. @RequestMapping("/callback/{source}")
  6. public Object login(@PathVariable("source") String source, AuthCallback callback) {
  7. AuthRequest authRequest = getAuthRequest(source);
  8. AuthResponse response = authRequest.login(callback);
  9. return response;
  10. }

注:第三方平台中配置的授权回调地址,以本文为例,在创建授权应用时的回调地址应为:[host]/callback/gitee

刷新token

注:refresh功能,并不是每个平台都支持

  1. AuthResponse response = authRequest.refresh(AuthToken.builder().refreshToken(token).build());

伪代码

  1. /**
  2. *
  3. * @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
  4. * @param token login成功后返回的refreshToken
  5. */
  6. @RequestMapping("/refresh/{source}")
  7. public Object refreshAuth(@PathVariable("source") String source, String token){
  8. AuthRequest authRequest = getAuthRequest(source);
  9. return authRequest.refresh(AuthToken.builder().refreshToken(token).build());
  10. }

取消授权

注:revoke功能,并不是每个平台都支持

  1. AuthResponse response = authRequest.revoke(AuthToken.builder().accessToken(token).build());

伪代码

  1. /**
  2. *
  3. * @param source 第三方授权平台,以本例为参考,该值为gitee(因为上面声明的AuthGiteeRequest)
  4. * @param token login成功后返回的accessToken
  5. */
  6. @RequestMapping("/revoke/{source}/{token}")
  7. public Object revokeAuth(@PathVariable("source") String source, @PathVariable("token") String token) throws IOException {
  8. AuthRequest authRequest = getAuthRequest(source);
  9. return authRequest.revoke(AuthToken.builder().accessToken(token).build());
  10. }

参考文章