java - spring security oauth2 JWT 刷新令牌返回“身份验证失败:invalid_token 无法将访问令牌转换为 JSON”
问题描述
我已经spring-security-oauth2
使用 JWT 实现了,初始身份验证和资源请求正常工作,令牌增强器也是如此。当我尝试使用刷新令牌获取新的 JWT 时,出现错误"cannot convert access token to JSON"
public class AuthorizationServerConfiguration extends AuthorizationServerConfigurerAdapter {
// ....
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
endpoints
.tokenStore(tokenStore())
.authenticationManager(authenticationManager)
.accessTokenConverter(accessTokenConverter())
.reuseRefreshTokens(false)
.userDetailsService(userDetailsService);
}
@Bean
public TokenStore tokenStore() {
return new JwtTokenStore(accessTokenConverter());
}
@Bean
JwtAccessTokenConverter accessTokenConverter() {
JwtAccessTokenConverter converter = new CustomTokenEnhancer();
converter.setSigningKey(jwtSigningKey);
converter.setVerifierKey(jwtSigningKey);
return converter;
}
@Override
public void configure(ClientDetailsServiceConfigurer clients) throws Exception {
Base64Utility base64 = new Base64Utility();
clients.inMemory()
.withClient(ApplicationConstants.CLIENT)
.resourceIds(securityConstants.audience)
.secret(...)
.scopes(AuthorizationConstants.READ)
.authorizedGrantTypes("password", "refresh_token")
.accessTokenValiditySeconds(securityConstants.getAccessTokenValiditySeconds())
.refreshTokenValiditySeconds(securityConstants.getRefreshTokenValiditySeconds());
}
}
返回的 access_token 是 normal three.part.token
,refresh_token
是这样的:22cc0513-8a19-42bb-9bd4-631c6758a273
我使用此 Javascript 代码尝试刷新它:
function refreshToken() {
var client = jwtForm.client.value;
var clientSecret = getClientSecret();
var data = "grant_type=refresh_token&refresh_token=" + jwt.refresh_token;
var xhr = new XMLHttpRequest();
xhr.open("POST", authServer + "/oauth/token");
xhr.setRequestHeader ("Authorization", "Basic " + btoa(client + ":" + atob(clientSecret)));
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
xhr.onreadystatechange = function () {
if(xhr.readyState == 4) {
processResponse(xhr);
}
};
xhr.send(data);
}
有任何想法吗?
解决方案
问题出在我的自定义 JwtAccessTokenConverter 中。如果您不打算创建自己的刷新令牌,则必须在增强方法中调用 super.enchance。一旦我调用了 super.enhance,它就会创建一个 JWT 刷新令牌。
推荐阅读
- similarity - 法语相似度插件
- javascript - 如何获取集合中的第一个和最后一个文档?
- docker - Docker 容器立即退出
- java - Checkstyle EmptyLineSeparator 忽略自定义标记
- javascript - 创建一个包装函数以接受内部函数的变量参数
- python - Selenium 适用于 AWS EC2,但不适用于 AWS Lambda
- visual-studio-code - Prettier 删除 2 个空行
- java - 具有两个不同列表的嵌套 lambda foreach(其中一个列表必须是最终的?)
- doc2vec - 如何在使用通用语料库训练后继续使用特定领域语料库训练 Doc2Vec
- matlab - 具有公分母的符号分数求和 (MATLAB)