撤销JWT的OAuth2刷新令牌
问题描述:
我试图找到一种方式来撤销的oauth2 JWT刷新令牌香草春季实施和JwtTokenStore。撤销JWT的OAuth2刷新令牌
第一:有人可以证实,没有任何类似于/ OAuth的/令牌API,让我撤销刷新令牌?
我想添加自定义的API,将删除刷新令牌沿如下因素线:
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,我可以验证用户身份并刷新令牌没有问题。但是,只要我添加InMemoryApprovalStore令牌店,我开始得到以下错误信息:
{"error":"invalid_grant","error_description":"Invalid refresh token: eyJhbGciOiJIUzI1NiJ9.eyJleHAiOjE0NDUwMjQ2MTcsInVzZXJfbmFtZSI6IjYzZjIyYjZlLWU5MGUtNDFjYS1iYzJlLTBmZTgzNmY3MTQ2NyIsImF1dGhvcml0aWVzIjpbIlJPTEVfQURNSU4iLCJST0xFX1VTRVIiXSwianRpIjoiMjgwMDgwNWQtMjk1Zi00ZDQzLWI2NTYtMDNlZWYwMWFkMjg0IiwiY2xpZW50X2lkIjoid2ViLWNsaWVudCIsInNjb3BlIjpbInJlYWQiLCJ3cml0ZSIsInRydXN0Il19.BPC0HqLYjWGM0IFjvsUGGKQ9dyIXSXwMhraCVFIxD0U"}
我的第二个问题是这样的是撤销刷新令牌的正确方法?
编辑:我发现表明,ApprovalStore确实撤销JWT令牌的方式following thread。我现在只需要了解如何正确使用它们。
答
第一:有人可以确认没有类似于/ oauth/token的API允许我撤销刷新令牌吗?
你并不需要定义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);
}
}
}
TokenApprovalStore并没有真正让你撤消刷新令牌。至少与JWTTokenStore没有关系。 JWTTokenStore.removeRefreshToken调用tokenStore.revokeApprovals。而这个方法又调用tokenStore.findTokensByClientIdAndUserName,它总是在JWTTokenStore的情况下返回一个空集。 – Klaus
是的,你是对的,但概念是相同的,使用'ApprovalStore'和实施是由你 – MangEngkus
如果我理解正确的审批程序,撤销批准意味着客户端应用程序不再授权“使用”该帐户,因此用户/客户端的所有访问权限和刷新令牌都将被拒绝。但是,如果您想要撤销单个刷新令牌,那么这不是太严格吗?撤销批准意味着用户不能再做任何事情。此外,只要稍后用户再次批准客户端,所有访问和刷新令牌都可以再次使用。没有办法以不妨碍其他访问和刷新标记的方式撤销刷新令牌吗? – Tom