【问题标题】:Get Access_Token from Microsoft Graph API via cURL通过 cURL 从 Microsoft Graph API 获取 Access_Token
【发布时间】:2019-12-03 18:15:39
【问题描述】:

当我根据 [1] 和 [2] 在 Cygwin 中运行此命令时,我会返回一个 Access_Token:

curl -X POST -d 'grant_type=client_credentials&client_id=[myClientId]&client_secret=[myAppSecret]&scope=openid profile User.ReadWrite User.ReadBasic.All Sites.ReadWrite.All Contacts.ReadWrite People.Read Notes.ReadWrite.All Tasks.ReadWrite Mail.ReadWrite Files.ReadWrite.All Calendars.ReadWrite' https://login.microsoftonline.com/[myTenantId]/oauth2/token

当我稍后尝试在这个简单的查询中使用该 access_token 时,我收到一个错误:

访问令牌验证失败。无效的观众

curl -X GET -H "Authorization: Bearer [accessTokenFromPreviousCommand]" https://graph.microsoft.com/v1.0/me

如果我在 Microsoft Graph Explorer 中运行 https://graph.microsoft.com/v1.0/me 查询,它可以正常工作。我还可以使用 Internet 浏览器的 Network 选项卡来获取现有的 access_token 并在第二个 cURL 命令中使用该获取的令牌来获取预期结果;但是,我还没有弄清楚如何成功获取从第一个 cURL 命令返回的 access_token 并在第二个 cURL 命令中使用它。

我确实在内部与一位开发人员讨论过这个问题,他提到我在看 [2],但我还是有点困惑。

有人会告诉我我在上述两个 cURL 命令中做错了什么吗?

[1] - 毛里,戴维德
通过 cURL 调用 Azure REST API
Medium.com
2018年5月4日[在线]
https://medium.com/@mauridb/calling-azure-rest-api-via-curl-eb10a06127
[访问日期:2019 年 12 月 3 日]

[2] - 伍兹,杰克逊;格雷厄姆,劳拉;古兹曼,塞莱斯特;天使高尔夫球手;维克,瑞恩;以及未来可能的贡献者
Microsoft Graph 的身份验证和授权基础知识
Microsoft Docs - Microsoft Graph
2019年9月19日[在线]
https://docs.microsoft.com/en-us/graph/auth/auth-concepts
[访问日期:2019 年 12 月 3 日]

【问题讨论】:

标签: curl microsoft-graph-api


【解决方案1】:

当您使用客户端凭据进行身份验证时,您不能使用/me。您需要通过id 或userPrincipalName 指定用户。

当 Graph 看到 /me 时,它会将该节点替换为“当前经过身份验证的用户的 id”。由于您在使用客户端凭据时没有经过身份验证的用户,因此 Graph 无法知道您正在寻找哪个用户。

【讨论】:

  • 这是有道理的。我找到了docs.microsoft.com/en-us/graph/auth-v2-user 并切换到了grant_type=authorization_code,我想我在添加了一个获取授权步骤后我得到了graph.microsoft.com/v1.0/me 的工作。
  • @ShawnEary 你解决了吗?我很想编辑你的问题,或者在这里回答你如何编辑它:)
  • @IraklisBekiaris - 我最终使用了跨平台 MSAL.js。必须完成一些最小的 Azure AD 设置,但这可能是关于如何使其工作的最简单的教程:docs.microsoft.com/en-us/azure/active-directory/develop/…
  • 我是这么认为的 :) 我也想走这条路,因为我认为我无法通过其他方式完成我需要的事情。非常感谢您的回复!
【解决方案2】:

我同意 LaFleur 先生的观点。根据 [3],获取访问令牌似乎有两种不同的工作流程:

  1. “代表用户获取访问权限”[4]
  2. “无需用户即可访问”[5]

由于缺乏理解,我显然试图混合这两种工作流程。就我而言,“代表用户获取访问权限”工作流程可能是最合适的。正如 LeFleur 先生和 [4] 都指出的那样,当使用 [4] 中所示的“代表用户获取访问权限”工作流程时,不能将授权类型设置为客户端凭据。相反,grant_type 应该设置为 authorization_code。不过,我还错过了另一个主要细节。根据 [4],您还必须运行 GET 请求以从用户那里获取授权码。此 GET 请求的示例如下所示:

https://login.microsoftonline.com/[yourTenantId]/oauth2/v2.0/authorize?client_id=[yourClientId]&response_type=code&response_mode=query&scope=user.read&state=[apparentlyThisIsJustSomeRandomNumber]

不幸的是,我不知道如何将 cURL 用于上述 GET 请求,因为它是交互式的;但是,很容易将上述 GET 请求粘贴到 Internet 浏览器上的 URL 窗口中,然后在任何可能的同意对话框上单击“是”。一旦您同意,您的浏览器将被定向到您的应用程序的 URL,该 URL 将在您的查询参数中包含一个“代码”值。该 URL 可能如下所示:

https://[locationOfYourApp]/?code=[bigLongUglyAuthCode]&state=[theStateValueYouSetPreviously]&session_state=[junkThatDoesNotMatterInThisExample]

您需要获取该代码,然后将其放入此格式的 cURL 命令中(请参阅 [4]):

    curl -X POST -d 'grant_type=authorization_code&client_id=[yourClientId]&client_secret=[yourAppSecret]&scope=User.Read&code=[bigLongUglyAuthCodeFromAbove]' https://login.microsoftonline.com/[yourTenantId]/oauth2/token

然后,您应该会收到一个响应,其中包含基于 /me 的查询的有效访问令牌,例如我在 12 月 3 日询问的那个。如果您及时将访问令牌插入此查询,则访问令牌将起作用:

    curl -X GET -H "Authorization: Bearer [accessTokenFromPreviousCommand]" https://graph.microsoft.com/v1.0/me

[3] – 微软和社区
Microsoft Graph 文档
[在线]
https://docs.microsoft.com/en-us/graph/
[访问日期:2019 年 12 月 4 日]

[4] – 泰克,杰里米;办公室跟谁学;格雷厄姆,劳拉;伍兹,杰克逊;艾伦,卡尔文; kjyam98(凯文);维克,瑞恩;以及未来可能的贡献者
代表用户获取访问权限
2019年9月19日[在线]
https://docs.microsoft.com/en-us/graph/auth-v2-user
[访问日期:2019 年 12 月 4 日]

[5] – 泰克,杰里米;伍兹,杰克逊;办公室跟谁学; kjyam98(凯文);格雷厄姆,劳拉;维克,瑞恩;以及未来可能的贡献者
无需用户即可访问
2019年9月19日[在线]
https://docs.microsoft.com/en-us/graph/auth-v2-service
[访问日期:2019 年 12 月 4 日]

【讨论】:

  • 我知道这因可能的错误信息而被否决,但我把它放回去了,因为我曾经有过这个工作。不过已经有一段时间了,所以我不记得细节了。话虽如此,根据我最近在上面的评论,带有 JWT 的 MSAL.js 可能是从客户端应用程序使用 API 或 Microsoft Graph 进行身份验证的最简单方法。虽然 cURL 很酷,但我个人对 MSAL.js 的运气更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-19
  • 2015-03-31
  • 2023-01-01
  • 1970-01-01
  • 2020-06-11
  • 1970-01-01
相关资源
最近更新 更多