升级到1.8.0后如何启用state?

在原api使用方法的基础上,为config追加一个state即可。

  1. AuthRequest authRequest = new AuthGiteeRequest(AuthConfig.builder()
  2. .clientId("clientId")
  3. .clientSecret("clientSecret")
  4. .redirectUri("redirectUri")
  5. .state("state") // 就是这儿
  6. .build());

升级到1.8.0后login方法报错?

这是因为1.8.0版本中新增了AuthCallback类,这个类封装了所有可能的回调参数。目前包含以下三个参数:

  • code: 访问AuthorizeUrl后回调时带的参数code,用来换取token
  • auth_code: 支付宝授权登陆时不会返回code而是返回auth_code参数
  • state: 访问AuthorizeUrl后回调时带的参数state,用于和请求AuthorizeUrl前的state比较,防止CSRF攻击 1.8.0版本之后的api,可以直接用AuthCallback类作为回调方法的入参,比如:
  1. @RequestMapping("/callback/{source}")
  2. public Object login(@PathVariable("source") String source, AuthCallback callback) {
  3. System.out.println("进入callback:" + source + " callback params:" + JSONObject.toJSONString(callback));
  4. AuthRequest authRequest = getAuthRequest(source);
  5. AuthResponse response = authRequest.login(callback);
  6. System.out.println(JSONObject.toJSONString(response));
  7. return response;
  8. }

代码截取自https://github.com/justauth/JustAuth-demo

升级到1.8.0后对于state参数有什么特殊要求吗?

理论上没有,stata只是用来保持会话状态,因为http协议的无状态性,从授权到回调,无法感知具体是哪个用户触发的。所以可以使用state作为校验。注:state参数每次完整的授权链中只可用一次!(也是为了防止不必要的危险)

作者建议state命名格式如下:

  • 授权登录:{source}{ip}{random}
  • 账号绑定:{source}{userId}{ip}_{random} 其中source表示授权平台,可以直接去JustAuth中的source,ip为当前用户的ip(部分情况可能不适用),random为随机字符串,userId为当前登录用户的id。

注:authorizelogin(不是指回调传回的state,而是声明request时传入的state)中传的state务必保证一致

升级到1.9.3+版本后编译失败

主要明显的就是IpUtils.getIp和request的.state报错。

这是因为从v1.9.3版本开始,对项目进行了一些优化,具体优化内容参考:v1.9.3v1.9.4

新版本的使用方式,参考JustAuth-demo

  1. @RequestMapping("/render/{source}")
  2. public void renderAuth(@PathVariable("source") String source, HttpServletResponse response) throws IOException {
  3. AuthRequest authRequest = getAuthRequest(source);
  4. String authorizeUrl = authRequest.authorize(AuthStateUtils.createState());
  5. response.sendRedirect(authorizeUrl);
  6. }
  7. @RequestMapping("/callback/{source}")
  8. public Object login(@PathVariable("source") String source, AuthCallback callback) {
  9. AuthRequest authRequest = getAuthRequest(source);
  10. AuthResponse response = authRequest.login(callback);
  11. return response;
  12. }

升级到最新版本后为什么支付宝登录不能用了?

在升级到新版后,使用支付宝登录会提示ClassNotFoundExcption异常,这是因为从1.9.4版本开始,JustAuth将不在强依赖alipay-sdk-java,如果你需要用到Alipay的授权登陆,那么你还需要添加以下依赖:

  1. <dependency>
  2. <groupId>com.alipay.sdk</groupId>
  3. <artifactId>alipay-sdk-java</artifactId>
  4. <version>3.7.4.ALL</version>
  5. </dependency>