7

我试图找到一种方式来撤销的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。我现在只需要了解如何正确使用它们。

回答

2

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

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