gpt4 book ai didi

spring-security - 撤销 JWT Oauth2 刷新 token

转载 作者:行者123 更新时间:2023-12-03 23:57:32 25 4
gpt4 key购买 nike

我试图找到一种方法来撤销 Oauth2 JWT Refresh Token 与 vanilla Spring 实现和 JwtTokenStore。

第一:有人可以确认没有类似于/oauth/token 的 API 允许我撤销刷新 token 吗?

我想添加一个自定义 API 来删除以下几行的刷新 token :

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

现在,查看 JwtTokenStore,我注意到它使用 ApprovalStore。所以我继续为我的 JwtTokenStore 提供了一个 InMemoryApprovalStore。我的 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,我可以毫无问题地验证用户和刷新 token 。但是,一旦我将 InMemoryApprovalStore 添加到 token 存储中,我就会开始收到以下错误消息:
{"error":"invalid_grant","error_description":"Invalid refresh token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NDUwMjQ2MTcsInVzZXJfbmFtZSI6IjYzZjIyYjZlLWU5MGUtNDFjYS1iYzJlLTBmZTgzNmY3MTQ2NyIsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1VTRVIiXSwianRpIjoiMjgwMDgwNWQtMjk1Zi00ZDQzLWI2NTYtMDNlZWYwMWFkMjg0IiwiY2xpZW50X2lkIjoid2ViLWNsaWVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il19.BPC0HqLYjWGM0IFjvsUGGKQ9dyIXSXwMhraCVFIxD0U"}

因此,我的第二个问题是撤销刷新 token 的正确方法是什么?

编辑:我发现 following thread 表明 ApprovalStore 确实是撤销 JWT token 的方法。我现在只需要找出如何正确使用它们。

最佳答案

First: can somebody confirm that there is no API similar to /oauth/token that allows me to revoke a refresh token?



Confirmed .

您不需要定义 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;
}

My second question is thus what is the proper way to revoke a refresh token?



撤销对 token 的批准,这是由 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);
}
}
}

关于spring-security - 撤销 JWT Oauth2 刷新 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32617645/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com