7

Sto cercando di trovare un modo per revocare il token di aggiornamento di Oauth2 JWT con l'implementazione di vanilla spring e JwtTokenStore.Revoke JWT Oauth2 Aggiorna token

Primo: qualcuno può confermare che non ci sono API simili a/oauth/token che mi consentono di revocare un token di aggiornamento?

ho voluto aggiungere un'API personalizzata che potrebbe eliminare il token di aggiornamento lungo le linee folowing:

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

Ora, guardando il JwtTokenStore, ho notato che utilizza un ApprovalStore. Così sono andato avanti e ho fornito un InMemoryApprovalStore al mio JwtTokenStore. Il mio JwtTokenStore istanziazione questo sguardo come segue:

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

Risultati: senza InMemoryApprovalStore, posso autenticare gli utenti e aggiornare i token senza problemi. Tuttavia, non appena aggiungo InMemoryApprovalStore al negozio di token, ho iniziare a ricevere il seguente messaggio di errore:

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

mia seconda domanda è quindi qual è il modo corretto di revocare un token di aggiornamento?

Modifica: ho trovato il following thread che suggerisce che ApprovalStore è davvero il modo per revocare i token JWT. Ora ho solo bisogno di scoprire come usarli correttamente.

risposta

2

Primo: qualcuno può confermare che non ci sono API simili a/oauth/token che mi consentono di revocare un token di aggiornamento?

Confirmed.

Non è necessario definire JwtTokenStore di fagioli, la primavera creerà per voi utilizzando 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; 
} 

La mia seconda domanda è quindi qual è il modo corretto di revocare un token di aggiornamento?

revocare l'approvazione per il token, questo è stato utilizzato da 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 in realtà non consentono di revoca un token di aggiornamento. Almeno non con JWTTokenStore. JWTTokenStore.removeRefreshToken chiama tokenStore.revokeApprovals. E questo metodo a sua volta chiama tokenStore.findTokensByClientIdAndUserName, che restituisce sempre un set vuoto nel caso di JWTTokenStore. – Klaus

+0

Sì, hai ragione, ma il concetto è lo stesso, usa 'ApprovalStore' e l'implementazione spetta a te – MangEngkus

+0

Se comprendo correttamente il processo di approvazione, revocare l'approvazione significa che l'applicazione client non è più autorizzata ad" usare " l'account e quindi tutti i token di accesso e aggiornamento per l'utente/client verranno rifiutati. Ma non è troppo rigoroso se tutto ciò che vuoi è revocare un singolo token di aggiornamento? Revocare l'approvazione significa che l'utente non può più fare nulla. Inoltre, non appena l'utente ha nuovamente approvato il client in un secondo momento, tutti i token di accesso e di aggiornamento possono essere riutilizzati. Non c'è un modo per revocare un token di aggiornamento in un modo che non blocchi altri access e aggiornare i token? – Tom