Отменить токен обновления JWT Oauth2

Я пытаюсь найти способ отозвать токен обновления OAuth2 JWT с реализацией vanilla Spring и jwttokenstore.

First: может ли кто-нибудь подтвердить, что нет 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"}

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

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

1 ответов


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

подтвердил.

вам не нужно определять JwtTokenStore bean, spring создаст его для вас, используя 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);
        }
    }
}