我正在研究authorization-server
和身份管理项目。其中一部分是通过MFA保护reset-password
端点。
authorization-server
项目中,reset-password
本身在身份管理项目中我认为在用户完成MFA之后,端点可以通过两种方法来验证用户是否有权重置密码:
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
的安全上下文中没有经过身份验证的用户>