0

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

我创建了一个邮递员集合进行测试,还从微软网站下载了官方邮递员集合,一切正常,直到访问令牌没有过期。当它过期时,尝试刷新令牌总是会导致错误,我非常坚持。我已经两次和三次检查了 redirect_url、权限、授权、复制/粘贴错误之间的对应关系,等待 access_token 过期后再尝试刷新......我已经完成了近 100 次测试,每次我都被困在刷新部分!

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

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 到令牌端点:

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...

我收到了一个访问令牌(在访问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 次测试(始终使用完整的登录/授权以始终使用新的刷新令牌)但没有运气。

似乎我在这里错过了一些非常愚蠢的东西,因为我无法想象其他人的行为都是正确的......但真的找不到出路!

4

2 回答 2

1

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

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

注意:我读到的所有内容都告诉我对值进行 URLEncode。我发现它在未编码的情况下与他们一起工作 - 不知道它是否真的会有所作为。由于它在帖子的正文中,这意味着它是 TLS 加密的。

另一个重要的事情是我发布到的网址。似乎有很多例子,但似乎没有一个是一致的。我使用了这种格式:

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

最后一件事是确保您使用的是正确的应用程序 ID。在我的情况下,我将 appId 用于错误的应用程序并且它没有得到同意。希望这可以帮助。我确实希望微软能够齐心协力,始终如一地阐明事情,并像一个不以安全为生的人一样思考。

于 2019-05-29T01:52:14.983 回答
0

终于解决了,感谢 Azure 支持。问题是客户端 ID:正如我之前所设想的,Microsoft 允许您定义另一个应用程序名称,但总是希望使用 GUID 客户端 ID 来提交任何请求。不幸的是,当我没有对其进行 url 编码时,它会警告我,但直到我尝试使用刷新令牌时才提醒我它不正确。

因此,只需仔细阅读文档:client_id:Azure 门户 - 应用注册体验分配给您的应用的应用程序(客户端)ID (因此不是您选择的那个)。

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

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

于 2019-06-26T15:33:42.733 回答