7

バニラスプリング実装とJwtTokenStoreでOauth2 JWTリフレッシュトークンを取り消す方法を探しています。JWT Oauth2リフレッシュトークンを取り消します

最初に、/ oauth/tokenに似たAPIがないため、リフレッシュトークンを取り消すことができますか?

OAuth2RefreshToken oauth2RefreshToken=tokenStore.readRefreshToken(refreshToken); 
tokenStore.removeRefreshToken(oauth2RefreshToken); 

は今、JwtTokenStoreを見て、私はそれがApprovalStoreを使用していることに気づい:

は、私はfolowing線に沿ってリフレッシュトークンを削除しますカスタムAPIを追加したいです。そこで、私はJwtTokenStoreにInMemoryApprovalStoreを提供しました。次のようにこれは見て私のJwtTokenStoreのインスタンス化:

@Bean 
protected JwtAccessTokenConverter jwtTokenEnhancer() { 
    JwtAccessTokenConverter converter = new JwtAccessTokenConverter(); 
    converter.setSigningKey("123456"); 
    return converter; 
} 

@Bean 
public JwtTokenStore getTokenStore(){ 
    tokenStore= new JwtTokenStore(jwtTokenEnhancer()); 
    tokenStore.setApprovalStore(new InMemoryApprovalStore()); 
    tokenStore.setTokenEnhancer(jwtTokenEnhancer()); 
    return tokenStore; 
}; 

結果:なしInMemoryApprovalStoreで、私はユーザーを認証することができますし、問題なくトークンを更新します。しかし、できるだけ早く私はトークンストアにInMemoryApprovalStoreを追加すると、私は次のエラーメッセージを取得を開始:

{"error":"invalid_grant","error_description":"Invalid refresh token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NDUwMjQ2MTcsInVzZXJfbmFtZSI6IjYzZjIyYjZlLWU5MGUtNDFjYS1iYzJlLTBmZTgzNmY3MTQ2NyIsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1VTRVIiXSwianRpIjoiMjgwMDgwNWQtMjk1Zi00ZDQzLWI2NTYtMDNlZWYwMWFkMjg0IiwiY2xpZW50X2lkIjoid2ViLWNsaWVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il19.BPC0HqLYjWGM0IFjvsUGGKQ9dyIXSXwMhraCVFIxD0U"} 

私の2番目の質問は、リフレッシュトークンを取り消すための適切な方法は何であるかようですか?

編集:承認ストアが確かにJWTトークンを取り消す方法であることを示唆するfollowing threadが見つかりました。私はちょうどそれらを適切に使用する方法を見つける必要があります。

答えて

2

最初に、/ oauth/tokenに似たAPIがないため、リフレッシュトークンを取り消すことができますか?

Confirmed。あなたはJwtTokenStore Beanを定義する必要はありません

、春はリフレッシュトークンを取り消すための適切な方法は何であるのでれるAuthorizationServerEndpointsConfigurer

private TokenStore tokenStore() { 
    if (tokenStore == null) { 
     if (accessTokenConverter() instanceof JwtAccessTokenConverter) { 
      this.tokenStore = new JwtTokenStore((JwtAccessTokenConverter) accessTokenConverter()); 
     } 
     else { 
      this.tokenStore = new InMemoryTokenStore(); 
     } 
    } 
    return this.tokenStore; 
} 

private ApprovalStore approvalStore() { 
    if (approvalStore == null && tokenStore() != null && !isApprovalStoreDisabled()) { 
     TokenApprovalStore tokenApprovalStore = new TokenApprovalStore(); 
     tokenApprovalStore.setTokenStore(tokenStore()); 
     this.approvalStore = tokenApprovalStore; 
    } 
    return this.approvalStore; 
} 

私の2番目の質問を使用して、あなたのためにそれを作るのだろうか?

トークンの承認を取り消すには、これは本当にあなたがリフレッシュトークンを取り消すことはできませんJwtTokenStore

private void remove(String token) { 
    if (approvalStore != null) { 
     OAuth2Authentication auth = readAuthentication(token); 
     String clientId = auth.getOAuth2Request().getClientId(); 
     Authentication user = auth.getUserAuthentication(); 
     if (user != null) { 
      Collection<Approval> approvals = new ArrayList<Approval>(); 
      for (String scope : auth.getOAuth2Request().getScope()) { 
       approvals.add(new Approval(user.getName(), clientId, scope, new Date(), ApprovalStatus.APPROVED)); 
      } 
      approvalStore.revokeApprovals(approvals); 
     } 
    } 
} 
+0

TokenApprovalStoreで使用されていました。少なくともJWTTokenStoreではそうではありません。 JWTTokenStore.removeRefreshTokenはtokenStore.revokeApprovalsを呼び出します。また、このメソッドはtokenStore.findTokensByClientIdAndUserNameを呼び出します。これは、JWTTokenStoreの場合は常に空のセットを返します。 – Klaus

+0

はい、あなたは正しいですが、コンセプトは同じです。承認ストアを使用して実装があなた次第です – MangEngkus

+0

承認プロセスを正しく理解している場合、承認を取り消すということは、クライアントアプリケーションが "使用"したがって、ユーザー/クライアントのすべてのアクセストークンとリフレッシュトークンは拒否されます。しかし、あなたが望むのは、単一のリフレッシュトークンを取り消すことだけであるならば、それほど厳密ではないでしょうか?承認を取り消すと、ユーザーはもう何もできません。さらに、後でユーザーがクライアントを再び承認するとすぐに、すべてのアクセストークンとリフレッシュトークンを再度使用できます。他のアクセスやトークンを更新しないようにリフレッシュトークンを取り消す方法はありませんか?私が間違っている場合 – Tom

関連する問題