在Oauth2中使用用户名验证访问令牌

时间:2017-01-25 07:36:18

标签: oauth oauth-2.0 spring-security-oauth2

我正在尝试为我的SPA应用程序实施OAuth2身份验证。我面临一个问题,例如有两个用户,user1和user2都登录。当user1尝试使用user2 访问令牌 时,user1可以访问。我不知道如何保护访问令牌。

2 个答案:

答案 0 :(得分:0)

每次用户使用oauth2身份验证登录时,它会将新登录用户的用户ID与唯一的access_token相关联,您可以获取该user_id,然后将其映射为当前登录用户的user_id找出用户是否正在使用自己的access_token。

答案 1 :(得分:0)

我找到了解决方案。 要自定义访问令牌,我们可以保护用户访问令牌。 我已使用令牌增强器自定义访问令牌。 代码如下所示

@Primary
    @Bean
    public DefaultTokenServices defaultTokenServices() {
        DefaultTokenServices defaultTokenServices = new DefaultTokenServices();
        defaultTokenServices.setTokenStore(tokenStore());
        defaultTokenServices.setTokenEnhancer(tokenEnhancer());
        defaultTokenServices.setSupportRefreshToken(true);
        return defaultTokenServices;
    }

和自定义增强器就像

 public OAuth2AccessToken enhance(OAuth2AccessToken accessToken, OAuth2Authentication authentication) {
    AppUserDetails appUserDetails = (AppUserDetails) authentication.getPrincipal();
    final Map<String, Object> additionalInfo = new HashMap<>();
    String encodedBytes = Base64.getEncoder().encodeToString(appUserDetails.getIdUser().toString().getBytes());
    additionalInfo.put("authorities", appUserDetails.getAuthorities());
    additionalInfo.put("username", appUserDetails.getUsername());
    additionalInfo.put("idUser", encodedBytes);
    ((DefaultOAuth2AccessToken) accessToken).setAdditionalInformation(additionalInfo);
    return accessToken;
}

在其他方法中,我已经解码了自定义访问令牌。 我也使用了AuthorizationServerEndpointsConfigurer

@Override
    //Configure the properties and enhanced functionality of the Authorization Server endpoints.
    public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
        endpoints.tokenStore(tokenStore()).tokenEnhancer(tokenEnhancer()).authenticationManager(authenticationManager);
    }