2017-01-17 3 views
1

У меня есть конфигурация Spring Security AuthorizationServerConfigurerAdapter, которая поддерживает типы предоставления пароля и refresh_token.Определить несколько TokenStore (s) в Spring secuirty OAUTH

clients 
     .inMemory() 
     .authorizedGrantTypes("password", "refresh_token") 
     ...; 

TokenStore я использую это JwtTokenStore, таким образом refresh_token и access_token генерируются как JWT, как я использую DefaultTokenServices

Вопрос в том, как может я имею refresh_token сгенерированного и управляемого JdbcTokenStore в то время как access_token все еще генерируется и управляется JwtTokenStore?

Я думал о расширении DefaultTokenServices или реализации AuthorizationServerTokenServices, но я не уверен, нет ли другого способа, предлагаемого по умолчанию spring-secuirty config.

Спасибо!

ответ

3

Один из способов, чтобы достичь сохраненных токенов (как токена доступа, так и токена обновления), и одновременно использовать маркеры с кодировкой JWT, предоставляет хранилище токенов tokenEnhancer типа JwtAccessTokenConverter.

@Bean 
protected TokenStore tokenStore() { 
    return new InMemoryTokenStore(); 
} 

@Bean 
protected JwtAccessTokenConverter jwtTokenEnhancer() { 
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
    converter.setSigningKey(privateKey); 
    converter.setVerifierKey(publicKey); 
    return converter; 
} 

@Override 
public void configure(ClientDetailsServiceConfigurer clients) throws Exception { 
    clients.inMemory().withClient("client_trusted")//... 
    ; 
} 

@Override 
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception { 
    endpoints.tokenStore(tokenStore()) 
     .tokenEnhancer(jwtTokenEnhancer()) // <- tokens are encoded in JWT 
     .authenticationManager(authenticationManager) 
     .userDetailsService(userDetailsService); 
    } 

При таком подходе вы можете легко отменить (или удалить) refresh_token. Таким образом, сервер авторизации не будет предоставлять новый токен доступа в следующем обновляемом токенном запросе. И информация в JWT остается автономной, а сервер ресурсов может работать без взаимодействия с сервером авторизации.

@Autowired 
protected TokenStore tokenStore; 

@RequestMapping(method = RequestMethod.POST, value = "/revoke") 
public void revokeToken(@RequestParam String token) { 
    ((InMemoryTokenStore)tokenStore).removeRefreshToken(token); 
} 

Вот полный пример авторизации и сервера ресурсов с Js клиента: https://github.com/pufface/spring-oauth-jwt-demo

+0

Означает ли это, после вызова (по "Выход" действие) ((InMemoryTokenStore) tokenStore) .removeRefreshToken (маркер); Это этот refreshToken больше не может быть использован для получения нового accessToken? ---- Я попробую! – mgalala

+0

Да, точно. Я добавил к моему ответу рабочий пример. – pufface

Смежные вопросы