JWT для сброса пароля с помощью mfa - PullRequest
0 голосов
/ 29 октября 2018

Я работаю над authorization-server и проектом по управлению идентификацией. Частью этого является защита конечной точки reset-password с помощью MFA.

  1. Логика MFA существует в проекте authorization-server,
  2. Однако сам reset-password находится в проекте управления идентификацией

Я думал, что после того, как пользователь завершит MFA, у конечной точки есть два способа проверить, что у пользователя есть привилегия для сброса пароля:

  • Добавьте ROLE_PASSWORD_RESET в роли полномочий, когда при вызове конечной точки reset-password я могу проверить базу данных, и если роль существует, я бы сбросил пароль
  • Второй способ - создать 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"
    }
    

И это код, который создает JWT в конце процесса MFA

    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

нет аутентифицированного пользователя.
  • Поворачиваю ли я пружинную защиту, чтобы сделать что-то, чего не предполагалось?
  • Какой совет по более чистому способу?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...