7

Я пытаюсь найти способ отозвать Oauth2 JWT Refresh Token с ванильной пружинной реализацией и JwtTokenStore.Отменить JWT Oauth2 Обновить токен

Во-первых: может ли кто-нибудь подтвердить, что API не похож на/oauth/token, что позволяет мне аннулировать токен обновления?

Я хотел бы добавить пользовательский интерфейс API, который будет удалить маркер обновления вдоль на следующие строки:

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

Теперь, глядя на JwtTokenStore, я заметил, что он использует ApprovalStore. Поэтому я пошел вперед и предоставил InMemoryApprovalStore свой JwtTokenStore. Моя 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"} 

Мой второй вопрос заключается в таким образом, что это правильный способ отменить токен обновления?

Редактировать: Я нашел following thread, что предполагает, что ApprovalStore действительно способ отменить токены JWT. Теперь мне просто нужно выяснить, как правильно их использовать.

ответ

2

Во-первых: может ли кто-нибудь подтвердить, что API не похож на/oauth/token, что позволяет мне аннулировать токен обновления?

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

Смежные вопросы