Я работаю над authorization-server
и проектом по управлению идентификацией. Частью этого является защита конечной точки reset-password
с помощью MFA.
- Логика MFA существует в проекте
authorization-server
,
- Однако сам
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
нет аутентифицированного пользователя.
- Поворачиваю ли я пружинную защиту, чтобы сделать что-то, чего не предполагалось?
- Какой совет по более чистому способу?