sso的redis保存code

Blade 未结 1 14

一、该问题的重现步骤是什么?

单点登录,是不是统一鉴权,各业务系统都必须要连到同一个redis?我看这里缓存了code


在统一授权时确认时,会写入到redis:

private void saveCode(String code, OAuth2User user) {

    // 保存code信息到redis,30分钟过期

    bladeRedis.setEx(OAuth2CodeUtil.codeKey(code), user, Duration.ofMinutes(30));

}


AuthorizationCodeGranter类在收到前端传过来的code时会从redis里找,没有找到会报错。是不是就意味着所有系统+统一授权要共用redis?

    @Override

    public OAuth2User user(OAuth2Request request) {

       // 获取客户端信息并校验

       OAuth2Client client = client(request);

       if (!StringUtil.equals(client.getWebServerRedirectUri(), request.getRedirectUri())) {

          OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_CLIENT_REDIRECT_URI);

       }

       // 根据code获取用户信息

       String code = request.getCode();

       OAuth2User user = bladeRedis.get(OAuth2CodeUtil.codeKey(code));

       // 判断用户是否存在

       if (ObjectUtil.isNotEmpty(user)) {

          // 校验用户信息

          if (!userService.validateUser(user)) {

             OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_USER);

          }

          // 校验用户密码

          if ((request.isCaptchaCode() || request.isPassword()) && !passwordHandler.matches(request.getPassword(), user.getPassword())) {

             OAuth2ExceptionUtil.throwFromCode(OAuth2ErrorCode.INVALID_USER);

          }

          // 设置客户端信息

          user.setClient(client);

          // 删除缓存的code信息防止二次认证

          bladeRedis.del(OAuth2CodeUtil.codeKey(code));

          // 返回user

          return Optional.ofNullable(this.enhancer)

             .map(enhancer -> enhancer.enhance(user, request))

             .orElse(user);

       }

       throw new UserInvalidException(ExceptionCode.INVALID_USER.getMessage());

    }


}

3.


二、你期待的结果是什么?实际看到的又是什么?

所有 系统+统一授权,必须共用同一个redis?

三、你正在使用的是什么产品,什么版本?在什么操作系统上?

bladex 4.4

四、请提供详细的错误堆栈信息,这很重要。


五、若有更多详细信息,请在下面提供。

1条回答
  • 如果要用到授权码模式,只需要blade-auth服务连接同一个redis就行,因为也就blade-auth服务内部会从redis获取code并且校验。第三方服务是通过接口的形式调用的,无需连接同一个redis。

    0 讨论(0)
提交回复