refresh_token 只有效一次
refresh_token only works once
我正在为这个挠头。
使用 JdbcTokenStore
:
我能够登录并从 oauth/token
端点获取 access_token
和 refresh_token
。 Web 客户端存储这两个令牌。在 access_token
过期并发送 HTTP 401 后,客户端尝试通过呈现 refresh_token
.
来获取新的 access_token
新的 access_token
和 refresh_token
再次存储在客户端。
然而,第二次这样做时,我收到一个 invalid_grant
错误,告诉我 refresh_token
是错误的。
这是日志:
2018-12-17T20:24:42.193Z INFO [main.js:1033] Login success.
...
ngx-logger.js:250 2018-12-17T20:24:42.195Z INFO [main.js:1034] {
"access_token": .72UGm5604uDyuY0eDSKE3s_Wr9GzhOFyYMsWoYKxdGs",
"token_type": "bearer",
"refresh_token": .5tucDhuMJciUufeosI-FG1lO5WaWQCq9_7G7kDPGmMc",
"expires_in": 4,
"scope": "read write",
"jti": "495c03d9-c19d-4239-9d94-9e96c49844f5"
}
ngx-logger.js:256 2018-12-17T20:24:42.198Z DEBUG [main.js:748] User is logged in.!
...
ngx-logger.js:250 2018-12-17T20:24:54.438Z INFO [main.js:843] Handling 401 error
ngx-logger.js:250 2018-12-17T20:24:54.441Z INFO [main.js:845] Refreshing access token
ngx-logger.js:250 2018-12-17T20:24:54.443Z INFO [main.js:1044] Attempting to refresh access token
ngx-logger.js:250 2018-12-17T20:24:54.446Z INFO [main.js:1045] refresh_token: .5tucDhuMJciUufeosI-FG1lO5WaWQCq9_7G7kDPGmMc
...
ngx-logger.js:250 2018-12-17T20:24:54.643Z INFO [main.js:854] Access token refreshed.
ngx-logger.js:250 2018-12-17T20:24:54.651Z INFO [main.js:855] {
"access_token": .gets297iCBDdNNK2C29PBTxRP1VdM9ok3ilo1g5Ow0A",
"token_type": "bearer",
"refresh_token": .NcJQOWDDo1q474LzvCeh37BjCn14I3E6e03JuWO208Y",
"expires_in": 4,
"scope": "read write",
"jti": "0fa0c63e-2027-4780-9ce3-501608cdaee5"
}
...
ngx-logger.js:247 2018-12-17T20:25:13.162Z ERROR [main.js:863] {
"headers": {
"normalizedNames": {},
"lazyUpdate": null
},
"status": 400,
"statusText": "OK",
"url": "https://192.168.1.144:8443/oauth/token",
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for https://192.168.1.144:8443/oauth/token: 400 OK",
"error": {
"error": "invalid_grant",
"error_description": "Invalid refresh token: .NcJQOWDDo1q474LzvCeh37BjCn14I3E6e03JuWO208Y"
}
}
我不知道这里可能有什么问题。我错过了什么吗?
原来我必须将 TokenEnhancerChain
设置为 而不是 重用刷新令牌。默认情况下显然是 true
因为这就是我们使用 refresh_tokens
的原因 - 它们应该表现得像 access_tokens
(如果你现在感到困惑:这是讽刺 - 我不知道 为什么默认值是true
,如果有人能澄清这一点,我会很高兴。
总之。在您要设置的配置中(类似于):
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
enhancerChain.setTokenEnhancers(Collections.singletonList(accessTokenConverter));
endpoints.tokenStore(tokenStore)
.accessTokenConverter(accessTokenConverter)
.tokenEnhancer(enhancerChain)
.reuseRefreshTokens(false) // <-------------- Set to false
.authenticationManager(authenticationManager);
}
Related issue on github: #867
我正在为这个挠头。
使用 JdbcTokenStore
:
我能够登录并从 oauth/token
端点获取 access_token
和 refresh_token
。 Web 客户端存储这两个令牌。在 access_token
过期并发送 HTTP 401 后,客户端尝试通过呈现 refresh_token
.
access_token
新的 access_token
和 refresh_token
再次存储在客户端。
然而,第二次这样做时,我收到一个 invalid_grant
错误,告诉我 refresh_token
是错误的。
这是日志:
2018-12-17T20:24:42.193Z INFO [main.js:1033] Login success.
...
ngx-logger.js:250 2018-12-17T20:24:42.195Z INFO [main.js:1034] {
"access_token": .72UGm5604uDyuY0eDSKE3s_Wr9GzhOFyYMsWoYKxdGs",
"token_type": "bearer",
"refresh_token": .5tucDhuMJciUufeosI-FG1lO5WaWQCq9_7G7kDPGmMc",
"expires_in": 4,
"scope": "read write",
"jti": "495c03d9-c19d-4239-9d94-9e96c49844f5"
}
ngx-logger.js:256 2018-12-17T20:24:42.198Z DEBUG [main.js:748] User is logged in.!
...
ngx-logger.js:250 2018-12-17T20:24:54.438Z INFO [main.js:843] Handling 401 error
ngx-logger.js:250 2018-12-17T20:24:54.441Z INFO [main.js:845] Refreshing access token
ngx-logger.js:250 2018-12-17T20:24:54.443Z INFO [main.js:1044] Attempting to refresh access token
ngx-logger.js:250 2018-12-17T20:24:54.446Z INFO [main.js:1045] refresh_token: .5tucDhuMJciUufeosI-FG1lO5WaWQCq9_7G7kDPGmMc
...
ngx-logger.js:250 2018-12-17T20:24:54.643Z INFO [main.js:854] Access token refreshed.
ngx-logger.js:250 2018-12-17T20:24:54.651Z INFO [main.js:855] {
"access_token": .gets297iCBDdNNK2C29PBTxRP1VdM9ok3ilo1g5Ow0A",
"token_type": "bearer",
"refresh_token": .NcJQOWDDo1q474LzvCeh37BjCn14I3E6e03JuWO208Y",
"expires_in": 4,
"scope": "read write",
"jti": "0fa0c63e-2027-4780-9ce3-501608cdaee5"
}
...
ngx-logger.js:247 2018-12-17T20:25:13.162Z ERROR [main.js:863] {
"headers": {
"normalizedNames": {},
"lazyUpdate": null
},
"status": 400,
"statusText": "OK",
"url": "https://192.168.1.144:8443/oauth/token",
"ok": false,
"name": "HttpErrorResponse",
"message": "Http failure response for https://192.168.1.144:8443/oauth/token: 400 OK",
"error": {
"error": "invalid_grant",
"error_description": "Invalid refresh token: .NcJQOWDDo1q474LzvCeh37BjCn14I3E6e03JuWO208Y"
}
}
我不知道这里可能有什么问题。我错过了什么吗?
原来我必须将 TokenEnhancerChain
设置为 而不是 重用刷新令牌。默认情况下显然是 true
因为这就是我们使用 refresh_tokens
的原因 - 它们应该表现得像 access_tokens
(如果你现在感到困惑:这是讽刺 - 我不知道 为什么默认值是true
,如果有人能澄清这一点,我会很高兴。
总之。在您要设置的配置中(类似于):
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
TokenEnhancerChain enhancerChain = new TokenEnhancerChain();
enhancerChain.setTokenEnhancers(Collections.singletonList(accessTokenConverter));
endpoints.tokenStore(tokenStore)
.accessTokenConverter(accessTokenConverter)
.tokenEnhancer(enhancerChain)
.reuseRefreshTokens(false) // <-------------- Set to false
.authenticationManager(authenticationManager);
}
Related issue on github: #867