7

Próbuję znaleźć sposób na unieważnienie tokena OWH2 JWT z implementacją wanilii Spring i JwtTokenStore.Unieważnij JWT Oauth2 Refresh Token

Po pierwsze: czy ktoś może potwierdzić, że nie ma API podobnego do/oauth/token, który pozwala mi odwołać token odświeżania?

chciałem dodać niestandardowe API, które usunąć token odświeżania wzdłuż linii folowing:

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

Teraz, patrząc na JwtTokenStore, zauważyłem, że używa ApprovalStore. Dlatego też podjąłem InMemoryApprovalStore do mojego JwtTokenStore. Moja JwtTokenStore instancji to wyglądać następująco:

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

Wyniki: bez InMemoryApprovalStore mogę uwierzytelniać użytkowników i odświeżyć znaki bez problemów. Jednakże, jak tylko dodam InMemoryApprovalStore do tokena sklepie, zacznę otrzymuję następujący komunikat o błędzie:

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

Moje drugie pytanie brzmi zatem jaki jest właściwy sposób cofnąć token odświeżania?

Edytuj: Znalazłem following thread, który sugeruje, że ApprovalStore jest rzeczywiście sposobem na odwołanie tokenów JWT. Teraz muszę po prostu dowiedzieć się, jak prawidłowo ich używać.

Odpowiedz

2

Po pierwsze: czy ktoś może potwierdzić, że nie ma API podobnego do/oauth/token, który pozwala mi odwołać token odświeżania?

Confirmed.

Nie trzeba zdefiniować JwtTokenStore fasoli, wiosna stworzy to dla ciebie za pomocą 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; 
} 

Moje drugie pytanie w ten sposób jest to, co jest właściwym sposobem odwołać token odświeżania?

cofnąć zgodę na zasadzie, ten był używany przez 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 naprawdę nie pozwalają odwołać token odświeżania. Przynajmniej nie z JWTTokenStore. JWTTokenStore.removeRefreshToken wywołań tokenStore.revokeApprovals. I ta metoda z kolei wywołuje tokenStore.findTokensByClientIdAndUserName, która zawsze zwraca pusty zestaw w przypadku JWTTokenStore. – Klaus

+0

Tak, masz rację, ale koncepcja jest taka sama, użyj 'ApprovalStore', a implementacja należy do ciebie – MangEngkus

+0

Jeśli dobrze rozumiem proces zatwierdzania, odwołanie zatwierdzenia oznacza, że ​​aplikacja kliencka nie jest już autoryzowana do" używania " konto, a zatem wszystkie dostęp i odświeżanie tokenów dla użytkownika/klienta zostanie odrzucone. Ale czy nie jest to zbyt rygorystyczne, jeśli chcesz tylko unieważnić pojedynczy token odświeżania? Odwołanie zatwierdzenia oznacza, że ​​użytkownik nie może już nic robić. Ponadto, gdy tylko użytkownik ponownie zatwierdzi klienta później, można ponownie użyć wszystkich tokenów dostępu i odświeżania. Czy nie ma sposobu na odwołanie tokena odświeżania w sposób, który nie blokuje innych uprawnień dostępu i odświeżania tokenów? – Tom