[英]Revoke JWT Oauth2 Refresh Token
我試圖找到一種方法來撤銷Oauth2 JWT刷新令牌與vanilla Spring實現和JwtTokenStore。
首先:有人可以確認沒有類似於/ oauth / token的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令牌的方法。 我現在只需要找出如何正確使用它們。
首先:有人可以確認沒有類似於/ oauth / token的API允許我撤銷刷新令牌嗎?
確認 。
你不需要定義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);
}
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.