programing

JWToauth2 새로 고침 토큰 취소

oldcodes 2023. 10. 26. 21:40
반응형

JWToauth2 새로 고침 토큰 취소

바닐라 스프링 구현으로 Oauth2 JWT Refresh Token을 취소하고 JwtToken Store를 취소할 방법을 찾고 있습니다.

먼저, 새로 고침 토큰을 취소할 수 있는 /oauth/token과 유사한 API가 없다는 것을 확인해 줄 수 있습니까?

리프레시 토큰을 다음 행에 따라 삭제하는 사용자 지정 API를 추가하고자 했습니다.

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

지금 JwtToken Store를 보니 Approval Store를 사용하고 있습니다.그래서 저는 JwtToken Store에 InMemory Approval Store를 제공했습니다.나의 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;
};

결과: InMemory ApprovalStore가 없어도 문제없이 사용자를 인증하고 토큰을 새로 고칠 수 있습니다.그러나 InMemory ApprovalStore를 토큰 저장소에 추가하는 즉시 다음 오류 메시지가 표시됩니다.

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

따라서 제 두 번째 질문은 리프레시 토큰을 취소하는 적절한 방법이 무엇인가 하는 것입니다.

편집: ApprovalStore가 실제로 JWT 토큰을 취소하는 방법임을 시사하는 다음 스레드를 찾았습니다.저는 이제 그것들을 제대로 사용하는 방법을 알아봐야 합니다.

먼저, 새로 고침 토큰을 취소할 수 있는 /oauth/token과 유사한 API가 없다는 것을 확인해 줄 수 있습니까?

확인됐습니다.

정의할 필요가 없습니다.JwtTokenStorebin, 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);
        }
    }
}

언급URL : https://stackoverflow.com/questions/32617645/revoke-jwt-oauth2-refresh-token

반응형