7

我試圖找到一種方式來撤銷的oauth2 JWT刷新令牌香草春季實施和JwtTokenStore。撤銷JWT的OAuth2刷新令牌

第一:有人可以證實,沒有任何類似於/ OAuth的/令牌API,讓我撤銷刷新令牌?

我想添加自定義的API,將刪除刷新令牌沿如下因素線:

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

現在,看着JwtTokenStore,我注意到,它使用ApprovalStore。所以我繼續向我的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"} 

我的第二個問題是這樣的是撤銷刷新令牌的正確方法?

編輯:我發現表明,ApprovalStore確實撤銷JWT令牌的方式following thread。我現在只需要瞭解如何正確使用它們。

回答

2

第一:有人可以確認沒有類似於/ oauth/token的API允許我撤銷刷新令牌嗎?

Confirmed

你並不需要定義JwtTokenStore豆,春天會使用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; 
} 

我的第二個問題是這樣的是撤銷刷新令牌正確的方法爲您創建它?

撤銷批准的道理,這是使用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

是的,你是對的,但概念是相同的,使用'ApprovalStore'和實施是由你 – MangEngkus

+0

如果我理解正確的審批程序,撤銷批准意味着客戶端應用程序不再授權「使用」該帳戶,因此用戶/客戶端的所有訪問權限和刷新令牌都將被拒絕。但是,如果您想要撤銷單個刷新令牌,那麼這不是太嚴格嗎?撤銷批准意味着用戶不能再做任何事情。此外,只要稍後用戶再次批准客戶端,所有訪問和刷新令牌都可以再次使用。沒有辦法以不妨礙其他訪問和刷新標記的方式撤銷刷新令牌嗎? – Tom