刷新令牌中的Azure Graph API 2.0错误:提供的授予无效或格式错误(AADSTS70000)

时间:2019-05-22 20:48:25

标签: azure-ad-graph-api refresh-token

我正在按照Microsoft网站(https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow#refresh-the-access-token)上的分步指南进行操作,一切正常,但是每次尝试刷新访问令牌时,都会出现此错误:AADSTS70000:提供的授权无效或格式错误。错误代码:70000。

我创建了一个Postman集合进行测试,还从Microsoft的网站下载了官方的postman集合,在访问令牌没有过期之前,一切工作正常。当它过期时,尝试刷新令牌始终会导致错误,我对此非常棘手。我已经仔细检查过redirect_url,权限,授予,复制/粘贴错误之间的对应关系,三重检查了两次,在尝试刷新之前等待access_token过期...我已经进行了近100次测试,每次都被困在刷新部分!

我首先在浏览器中对Microsoft Login API进行正常调用,然后从浏览器中获取查询字符串中的代码(这里没有问题)(请注意,client_id是URL编码的,因为在我的测试环境中,客户端id由于我们正在使用的Drupal portan的配置,因此是一个URL,我正努力在邮递员中重新创建相同的行为)

https://login.microsoftonline.com/{tenant_guid}/oauth2/v2.0/authorize?client_id={myclient_id_urlencoded}&response_type=code&redirect_uri={redirect_uri_urlencoded}&scope=offline_access%20https%3A%2F%2Fgraph.microsoft.com%2Fuser.read&state=12345

然后将代码与查询字符串中的代码一起发布到令牌端点:

POST /{tenant_guid}/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com

Content-Type: application/x-www-url-form-urlencoded
cache-control: no-cache
Postman-Token: a0456a8d-6979-491f-b61e-86b5d614c577

client_id={myclient_id_urlencoded}
scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
redirect_uri={redirect_uri_urlencoded}
grant_type=authorization_code
client_secret={client_secret_urlencoded}
code=OAQABAAIAAADCoMpjJXrxTq9VG9te-7FXujKZhF...

我收到一个accesso令牌(该令牌在访问https://graph.microsoft.com/v1.0/me的过程中像一个小时一样工作)和刷新令牌。当原始访问令牌过期时,我希望使用refresh_token grant_type

获得一对新的访问/刷新令牌。
POST /tenant_guid/oauth2/v2.0/token HTTP/1.1
Host: login.microsoftonline.com

Content-Type: application/x-www-url-form-urlencoded
cache-control: no-cache
Postman-Token: 5d71f813-768e-476c-a97f-c109fba3165e

client_id={myclient_id_urlencoded}
scope=https%3A%2F%2Fgraph.microsoft.com%2Fuser.read
redirect_uri={redirect_uri_urlencoded}
grant_type=refresh_token
cclient_secret={client_secret_urlencoded}
refresh_token=OAQABAAAAAADCoMpjJXrxTq9VG9te-7FX8m6YMg-.....

但是无论我是在访问令牌到期之前还是在关闭邮递员并重新打开邮递员之后尝试,我总是会收到该错误。我已经完成了将近50项测试(总是有完整的登录/授权操作,以始终使用新的刷新令牌),但运气不佳。

似乎我在这里缺少了一些愚蠢的东西,因为我无法想象其他人的行为都正确无误……但真的找不到出路!

2 个答案:

答案 0 :(得分:0)

所以我刚开始工作!这是我需要的必需参数:

client_id = your client id
refresh_token = the refresh token here
grant_type = refresh_token,
client_secret = secret

注意:我阅读的所有内容都告诉我URLEncode这些值。我发现它可以与他们一起使用UNENCODED-不知道它是否真的会有所作为。由于它在帖子的正文中进行,这意味着它已进行TLS加密。

另一个重要的事情是我发布到的URL。似乎有太多的例子,而且似乎没有一个是一致的。我使用了这种格式:

https://login.microsoftonline.com/{tenantId}/oauth2/v2.0/token

最后一件事是确保您使用正确的应用程序ID。就我而言,我为错误的应用程序使用了appId,但未获得同意。希望这可以帮助。我确实希望微软能够做出一致的努力,一贯地阐明事情,并像一个不以安全为生的人那样思考。

答案 1 :(得分:0)

最后解决了,谢谢Azure支持。 问题是客户端ID:正如我之前假设的那样,Microsoft允许您定义另一个应用程序名称,但始终希望使用GUID客户端ID提交任何请求。不幸的是,当我未对其进行url编码时,它向我发出警告,但直到我尝试使用刷新令牌时,才警告我它是不正确的。

因此,请非常仔细地阅读以下文档:client_id:应用程序(客户端)ID, Azure门户–应用程序注册经验分配给您的应用程序(因此您选择的不是)。

https://docs.microsoft.com/en-us/azure/active-directory/develop/v2-oauth2-auth-code-flow

也许在文档中包含格式验证会有所帮助!