2017-01-17 4 views
1

パスワードとrefresh_tokenグラントタイプをサポートするSpringセキュリティAuthorizationServerConfigurerAdapterの設定があります。私が使用していますSpringで複数のトークンストアを定義するsecuirty OAUTH

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

TokenStore、私は質問がしながら、私はJdbcTokenStoreでrefresh_tokenを生成し、管理していることができる方法であるDefaultTokenServices

を使用していてこれrefresh_tokenとaccess_tokenはをJWTとして生成され、JwtTokenStoreですaccess_tokenはまだ生成され、JwtTokenStoreによって管理されますか?

DefaultTokenServicesを拡張するか、AuthorizationServerTokenServicesを実装することを考えましたが、デフォルトのspring-secuirty設定で提供される方法が他にないかどうかはわかりません。

ありがとうございます!

答えて

3

格納されたトークン(アクセストークンとリフレッシュトークンの両方)を達成し、同時にJWTでエンコードされたトークンを取得する方法の1つは、tokenEnhancerのトークンストアJwtAccessTokenConverterを提供します。あなたは簡単に取り消す(または削除)refresh_tokenすることができます。このアプローチでは

@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); 
    } 

。したがって、認可サーバーは、次のリフレッシュトークン要求で新しいアクセストークンを提供しません。また、JWTの情報は自己完結型のままであり、リソースサーバーは認証サーバーとのやりとりなしで動作することができます。 ((InMemoryTokenStore)tokenStore).removeRefreshToken(トークン)https://github.com/pufface/spring-oauth-jwt-demo

+0

は( "ログアウト" アクションで)呼び出した後、この平均値をんが、それ以下は

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

はjsのクライアントとの許可およびリソースサーバの完全な例でありますこのrefreshTokenを新しいaccessTokenを取得するために使用することはできません。 ---- 私は試してみましょう! – mgalala

+0

はい、正確です。私は私の答えの作業例に加えました。 – pufface