"Provided Authorization Grant is invalid" 使用 refresh_token WSO2 IS 5.2.0 时
"Provided Authorization Grant is invalid" when using refresh_token WSO2 IS 5.2.0
我最近将我的环境从 WSO2 IS 5.0.0 更新到 WSO2 IS 5.2.0。我的环境由部署在 EC2 AWS 实例上的一台机器组成。我正在使用 MySQL(不是默认的 H2 数据库)。部署IS的机器是WindowsServer 2012 R2.
我正在使用密码授予类型来获取特定用户的访问令牌并存储刷新令牌,以便我能够在需要时发出另一个访问令牌。我正在执行以下请求以获得访问令牌:
POST
https://(IS-URL)/oauth2/token?scope=openif&grant_type=password&username=test@abv.bg@localhost.io&password=Asd123@@
配置适当的 Authorization Basic header
之后,我使用刷新令牌来发布新的访问令牌。例如:
POST
https://(IS-URL)/oauth2/token?scope=openid&grant_type=refresh_token&refresh_token=
配置适当的 Authorization Basic header
在我以 2-5 秒的间隔多次执行来自 Postman 的最新 POST 调用后,在前 5-7 次调用之后,我开始收到以下错误响应:
{
"error": "invalid_grant",
"error_description": "Provided Authorization Grant is invalid"
}
我期待收到新的访问令牌,但我却收到上述错误。然后我通过更新以下行修改了 log4j.properties:
log4j.logger.org.wso2.carbon.identity=DEBUG
log4j.logger.org.wso2.carbon.identity.application=DEBUG
log4j.logger.org.wso2.carbon.identity.mgt=DEBUG
log4j.logger.org.wso2.carbon.identity.oauth2=DEBUG
log4j.logger.org.wso2.carbon.identity.provisioning=DEBUG
log4j.logger.org.wso2.carbon.identity.user.account.association=DEBUG
log4j.logger.org.wso2.carbon.identity.user.profile.mgt=DEBUG
然后我启动了 IS 并再次尝试了上述场景,这是我在日志文件中收到的内容:
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.OAuth2Service} - Access Token request received for Client ID GCFfyPSGkykWG4zQTKoDp8NEvjIa, User ID null, Scope : [openid] and Grant Type : refresh_token
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Can authenticate with client ID and Secret. Client ID: GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Grant type : refresh_token Strict client validation set to : null
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Client credentials were available in the cache for client id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Successfully authenticated the client with client id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler} - Access Token is not in 'ACTIVE' or 'EXPIRED' state for Client with Client Id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - Invalid Grant provided by the client Id: GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - OAuth-Error-Code=invalid_grant client-id=GCFfyPSGkykWG4zQTKoDp8NEvjIa grant-type=refresh_token scope=openid
有关详细信息,请查看整个日志文件:
https://www.dropbox.com/s/ygfc9hrrgxjkzkh/console.log?dl=0
有人遇到过类似的问题吗,这可能是 IS 中的错误还是由某种错误配置引起的?
我查看了 Refresh token returns invalid grant type,但无法找到问题的直接答案。
只想提一下,我尝试每秒发出一个请求,并每隔 5 分钟尝试一次,但无法重现该问题。好像是请求频率足够高的时候才会出现。
提前致谢。
根据 this code 和您的日志,访问令牌既不处于 'ACTIVE' 也不处于 'EXPIRED' 状态。您可以在 IDN_OAUTH2_ACCESS_TOKEN
table 中查找该特定标记。这会给你一个关于哪里出了问题的提示。
更新:
我分析了你的数据集。问题在于,由于您已多次发送相同的令牌请求,因此此 table 中有许多条目 TOKEN_STATE=INACTIVE
。而且你在 TIME_CREATED 列中有 2 个具有相同时间戳的条目(即 2016-11-17 11:40:02),这恰好是最新的。因此,当 IS 尝试选择最新的令牌(理想情况下应该是 ACTIVE 令牌)时,db 服务器 returns 2 个令牌。但 IS 必须只选择一个。它可以是这两个中的任何一个,因为时间戳是相同的。因此,当它选择 INACTIVE 时,您应该会看到上述错误。
理想情况下,IS 应该妥善处理这件事。但作为你的解决方案,如果你不经常发送相同的请求,你应该能够摆脱错误。只需发送一个请求,然后等待响应到来。如果花很多时间,那就另当别论了。
我最近将我的环境从 WSO2 IS 5.0.0 更新到 WSO2 IS 5.2.0。我的环境由部署在 EC2 AWS 实例上的一台机器组成。我正在使用 MySQL(不是默认的 H2 数据库)。部署IS的机器是WindowsServer 2012 R2.
我正在使用密码授予类型来获取特定用户的访问令牌并存储刷新令牌,以便我能够在需要时发出另一个访问令牌。我正在执行以下请求以获得访问令牌:
POST
https://(IS-URL)/oauth2/token?scope=openif&grant_type=password&username=test@abv.bg@localhost.io&password=Asd123@@
配置适当的 Authorization Basic header
之后,我使用刷新令牌来发布新的访问令牌。例如:
POST
https://(IS-URL)/oauth2/token?scope=openid&grant_type=refresh_token&refresh_token=
配置适当的 Authorization Basic header
在我以 2-5 秒的间隔多次执行来自 Postman 的最新 POST 调用后,在前 5-7 次调用之后,我开始收到以下错误响应:
{
"error": "invalid_grant",
"error_description": "Provided Authorization Grant is invalid"
}
我期待收到新的访问令牌,但我却收到上述错误。然后我通过更新以下行修改了 log4j.properties:
log4j.logger.org.wso2.carbon.identity=DEBUG
log4j.logger.org.wso2.carbon.identity.application=DEBUG
log4j.logger.org.wso2.carbon.identity.mgt=DEBUG
log4j.logger.org.wso2.carbon.identity.oauth2=DEBUG
log4j.logger.org.wso2.carbon.identity.provisioning=DEBUG
log4j.logger.org.wso2.carbon.identity.user.account.association=DEBUG
log4j.logger.org.wso2.carbon.identity.user.profile.mgt=DEBUG
然后我启动了 IS 并再次尝试了上述场景,这是我在日志文件中收到的内容:
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.OAuth2Service} - Access Token request received for Client ID GCFfyPSGkykWG4zQTKoDp8NEvjIa, User ID null, Scope : [openid] and Grant Type : refresh_token
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Can authenticate with client ID and Secret. Client ID: GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} - Grant type : refresh_token Strict client validation set to : null
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Client credentials were available in the cache for client id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} - Successfully authenticated the client with client id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler} - Access Token is not in 'ACTIVE' or 'EXPIRED' state for Client with Client Id : GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - Invalid Grant provided by the client Id: GCFfyPSGkykWG4zQTKoDp8NEvjIa
[2016-11-15 21:29:18,873] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} - OAuth-Error-Code=invalid_grant client-id=GCFfyPSGkykWG4zQTKoDp8NEvjIa grant-type=refresh_token scope=openid
有关详细信息,请查看整个日志文件:
https://www.dropbox.com/s/ygfc9hrrgxjkzkh/console.log?dl=0
有人遇到过类似的问题吗,这可能是 IS 中的错误还是由某种错误配置引起的?
我查看了 Refresh token returns invalid grant type,但无法找到问题的直接答案。
只想提一下,我尝试每秒发出一个请求,并每隔 5 分钟尝试一次,但无法重现该问题。好像是请求频率足够高的时候才会出现。
提前致谢。
根据 this code 和您的日志,访问令牌既不处于 'ACTIVE' 也不处于 'EXPIRED' 状态。您可以在 IDN_OAUTH2_ACCESS_TOKEN
table 中查找该特定标记。这会给你一个关于哪里出了问题的提示。
更新:
我分析了你的数据集。问题在于,由于您已多次发送相同的令牌请求,因此此 table 中有许多条目 TOKEN_STATE=INACTIVE
。而且你在 TIME_CREATED 列中有 2 个具有相同时间戳的条目(即 2016-11-17 11:40:02),这恰好是最新的。因此,当 IS 尝试选择最新的令牌(理想情况下应该是 ACTIVE 令牌)时,db 服务器 returns 2 个令牌。但 IS 必须只选择一个。它可以是这两个中的任何一个,因为时间戳是相同的。因此,当它选择 INACTIVE 时,您应该会看到上述错误。
理想情况下,IS 应该妥善处理这件事。但作为你的解决方案,如果你不经常发送相同的请求,你应该能够摆脱错误。只需发送一个请求,然后等待响应到来。如果花很多时间,那就另当别论了。