当前位置: 首页 > 知识库问答 >
问题:

使用授权代码流获取具有有效刷新令牌的新令牌时出错

佟英武
2023-03-14

我使用WSO2 API manager 1.10.0,WSO2 Identity Server 5.1.0配置为密钥管理器,MySQL Community Server 5.6用于数据库。当我尝试刷新通过授权代码授权类型获得的令牌(refresh_token授权类型)时,我收到400错误请求错误(invalid_grant -提供的授权授权无效),并且我无法获得新令牌。然后,我尝试使用client_credentials和密码授权类型,对于这些类型,我能够刷新令牌。

我检查了身份服务器日志,发现当身份服务器尝试检索最新令牌时出现错误(下面的日志)。

TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.OAuth2Service} -  Access Token request received for Client ID OQU0_FyRQcdvTFbygziFw67ASHwa, User ID null, Scope : [openid, profile] and Grant Type : refresh_token 
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} -  Can authenticate with client ID and Secret. Client ID: OQU0_FyRQcdvTFbygziFw67ASHwa 
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.clientauth.AbstractClientAuthHandler} -  Grant type : refresh_token Strict client validation set to : null 
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} -  Client credentials were available in the cache for client id : OQU0_FyRQcdvTFbygziFw67ASHwa 
TID: [-1234] [] [2016-12-15 12:40:00,470] DEBUG {org.wso2.carbon.identity.oauth2.util.OAuth2Util} -  Successfully authenticated the client with client id : OQU0_FyRQcdvTFbygziFw67ASHwa 
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.handlers.grant.RefreshGrantHandler} -  Error while retrieving the latest refresh token 
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} -  Invalid Grant provided by the client Id: OQU0_FyRQcdvTFbygziFw67ASHwa 
TID: [-1234] [] [2016-12-15 12:40:00,474] DEBUG {org.wso2.carbon.identity.oauth2.token.AccessTokenIssuer} -  OAuth-Error-Code=invalid_grant client-id=OQU0_FyRQcdvTFbygziFw67ASHwa grant-type=refresh_token scope=openid profile 
TID: [-1234] [] [2016-12-15 12:40:06,492] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -  Running deployment synchronizer update... tenant : carbon.super 
TID: [-1234] [] [2016-12-15 12:40:06,588] DEBUG {org.wso2.carbon.core.deployment.CarbonDeploymentSchedulerTask} -  Running deployment synchronizer commit... tenant : carbon.super 

我调试了源代码,我认为这个问题可能与以下SQL查询有关,特别是USER_DOMAIN=null子句。

SELECT ACCESS_TOKEN, REFRESH_TOKEN, TIME_CREATED, REFRESH_TOKEN_TIME_CREATED, VALIDITY_PERIOD, REFRESH_TOKEN_VALIDITY_PERIOD, TOKEN_STATE, USER_TYPE, TOKEN_ID, SUBJECT_IDENTIFIER FROM IDN_OAUTH2_ACCESS_TOKEN WHERE CONSUMER_KEY_ID = (SELECT ID FROM IDN_OAUTH_CONSUMER_APPS WHERE CONSUMER_KEY = 'OQU0_FyRQcdvTFbygziFw67ASHwa') AND AUTHZ_USER='michael.pinheiro' AND TENANT_ID=-1234 AND USER_DOMAIN=null AND TOKEN_SCOPE_HASH='369db21a386ae433e65c0ff34d35708d' ORDER BY TIME_CREATED DESC LIMIT 1

我还注意到,当使用授权代码授权类型时,表 IDN_OAUTH2_ACCESS_TOKEN 中创建的访问令牌将用户域列设置为 NULL,但是当使用密码或client_credentials授权类型时,值为“PRIMARY”。

这可能是一个错误,还是我缺少任何在创建新的访问令牌时以某种方式将用户域设置为 PRIMARY 的参数?

我写下了为重现问题而执行的所有步骤:

步骤1:我通过重定向到获取授权代码https://identity-dev.domain.pt/oauth2/authorize?response_type=code

第2步:使用上一步中接收到的代码,我通过执行以下操作获取访问令牌(和刷新令牌):

curl-X POST-H " Content-Type:application/X-www-form-urlencoded "-d ' grant _ Type = authorization _ code

步骤3:使用上一步中收到的刷新令牌,我执行下面的请求来获取新令牌,但是我收到了400错误请求,如本文所述。

curl-X POST-H“授权:基本T1FVMF9GeVJRY2R2VEZieWd6aUZ3NjdBU0h3YToza0M2VWY5ZjhMcjhIVmwybjAzZGhRYzU3SnH”-H“内容类型:应用程序/X-www-form-urlencoded”-H”接受:应用程序.json“-d'授权类型=刷新令牌

欢迎任何帮助!

共有1个答案

杨雪松
2023-03-14

此问题已在[1]中报告,并在以后的版本中修复。请参阅jira链接中的修复程序。您可以尝试将IS 5.2.0配置为密钥管理器的APIM 2.0.0

[1] https://wso2.org/jira/browse/IDENTITY-4322

 类似资料:
  • 我执行本问题中描述的步骤: Laravel的5.3护照和api路由 从api的路径来看,一切都很好,我可以注册新用户,读取他们的数据等等。 然后在AuthServiceProvider上添加此命令 护照::代币ExpireIn(碳::现在()- 我以url{{url}}/oauth/token登录邮递员 正文:application/x-www-form-urlencoded { 授权类型:{pa

  • 我想我获得了使用授权代码授予类型的OAuth2流。资源所有者登录到服务器,然后使用授权代码重定向到客户端。然后客户端使用授权代码向授权服务器查询访问令牌和刷新令牌。这就是我困惑的地方。 当访问令牌过期时,客户端应该使用授权码还是刷新令牌来获取新的访问令牌?如果您有授权代码,为什么要使用刷新令牌? 注:我并不是在找一个回答说“刷新令牌是可选的”,因为我正在为amazon-alexa编写这个服务器,这

  • 我们正在尝试将DocuSign与我们的产品集成。 我们的场景:我们的组织有一个(合作伙伴)帐户。我们创建了一个集成密钥(ClientID)和Secret。我们希望我们的客户使用他们自己的帐户(不是我们合作伙伴帐户的子帐户(管理员-用户关系))创建信封,并生成签名URL以及我们的集成商密钥和机密。 以下步骤: 创建了一个帐户(合作伙伴帐户) 问题:是否可以将一个帐户的集成商密钥和密码与另一个帐户(两

  • 我能够获得此访问令牌,但是,当我试图获得刷新令牌时,我得到一个错误。 在这一刻,我正在测试这个使用邮递员。 我正在做以下工作: null null null null null

  • 我的应用程序使用Google refresh令牌(从Google获得access_token)。我在这里有两个问题: 我知道谷歌刷新令牌不会在6个月内过期(见这里的文档);假设我在1月1日下午5:00pm获得了一个刷新令牌,并且我的应用程序在1月1日下午5:30从Google请求了另一个刷新令牌,那么旧的刷新令牌是否仍然有效(显然旧的还没有过期)?--基本上,我询问新发出的refresh_toke

  • 我已经阅读了许多帖子,所有我能找到的Google文档,并尝试了以下的许多迭代,但仍然无法获得访问和刷新令牌。我确实获得了授权代码,但似乎无法获得该代码来交易访问和刷新令牌。 这样,我就可以在我的属性中剪切并粘贴一个访问代码(只是测试并尝试让它先工作)来获得刷新和访问令牌。 在initRefreshToken()方法中,源代码如下: 如果这是第二次或以后使用该代码,将打印以下内容: 推荐令牌: **