JWT使用MFA重置密码

时间:2018-10-29 11:49:22

标签: spring-security jwt spring-security-oauth2

我正在研究authorization-server和身份管理项目。其中一部分是通过MFA保护reset-password端点。

  1. MFA逻辑存在于authorization-server项目中,
  2. 但是,reset-password本身在身份管理项目中

我认为在用户完成MFA之后,端点可以通过两种方法来验证用户是否有权重置密码:

  • 在授权角色中添加一个ROLE_PASSWORD_RESET,当调用reset-password端点时,我可以检查数据库,如果该角色存在,我将重置密码
  • 第二种方法是创建一个JWT,该JWT在短时间内失效。然后,前端会将这个JWT传递到密码保留端点,该端点将对该JWT进行解码,并在JWT有效的情况下重置密码。 解码后的JWT看起来像这样

    {
      "exp": 1540811250,
      "user_name": "blah",
      "authorities": [
        "ROLE_PASSWORD_RESET"
      ],
      "jti": "fdbb528a-39b4-46f7-a336-79b5caa7439f",
      "client_id": "04a14e01-f303-41ca-8a7f-aa62e38a8261"
    }
    

这是在MFA流程结束时生成JWT的代码

    if (authentication instanceof AnonymousAuthenticationToken) {
        final String username = mfaVerificationRequest.getUsername();
        final Collection <GrantedAuthority> authorities = AuthorityUtils.createAuthorityList(ROLE_PASSWORD_RESET);
        final Authentication authenticationToken = new UsernamePasswordAuthenticationToken(username, null, authorities);
        final String clientId = request.getParameter(OAuth2Utils.CLIENT_ID);
        final ClientDetails clientDetails = clientDetailsService.loadClientByClientId(clientId);
        final OAuth2Request auth2Request = new OAuth2Request(null, clientDetails.getClientId(), authorities, true, clientDetails.getScope(), null, null, null, null);
        final OAuth2Authentication oAuth2Authentication = new OAuth2Authentication(auth2Request, authenticationToken);
              DefaultOAuth2AccessToken.valueOf(createOauth2AccessTokenMap(clientDetails.getScope()));
        final OAuth2AccessToken enhancedAuth2AccessToken = jwtAccessTokenConverter.enhance(accessToken, oAuth2Authentication);
        response.setStatus(SC_OK);
        response.setContentType(MediaType.APPLICATION_JSON);
        response.setCharacterEncoding(StandardCharsets.UTF_8.name());
        mapper.writeValue(response.getWriter(), enhancedAuth2AccessToken);
        return;
    }

我相信第二种方法是不可靠的,因为:

令牌(据我了解)是针对经过身份验证的用户 ,但是当用户尝试重置密码时,在authorization-server的安全上下文中没有经过身份验证的用户

  • 我是否会扭曲弹簧安全性以做本不该做的事情?
  • 有没有更清洁的建议?

0 个答案:

没有答案