Microsoft Graph API - 始终发送电子邮件 return 响应代码 403 和错误文本 "Access is denied. Check credentials and try again."

Microsoft Graph API - Send Emails always return response code 403 with error text "Access is denied. Check credentials and try again."

我们已经实现了通过图表发送电子邮件 api。

在 Microsoft 应用程序 https://apps.dev.microsoft.com 中,我们创建了应用程序并为此应用程序设置了权限 'Mail.Send'。

对于身份验证,我们使用 "Get access without a user" 方式。

我们正在通过此 url 接收令牌: https://login.microsoftonline.com/our_tenant/oauth2/v2.0/token body 看起来像这样:

"client_id=app_id&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default&client_secret=app_secret_key&grant_type=client_credentials"

使用此 link:

发送邮件

https://graph.microsoft.com/v1.0/users/user_Email/sendMail

在 body json 中,电子邮件 Object。

当我们通过此方法发送电子邮件时,会收到带有文本 "Access is denied. Check credentials and try again."

的响应代码“403”

在测试之前,我们已经为开发此集成创建了试用帐户。有了试用帐户,这个过程就完美无缺了。
你能帮忙解决当前的问题吗?也许我们忘记了什么或帐户有问题。

此致

每当你遇到这样的问题时,你有一个令牌并且你认为你应该可以访问某些东西,但是 API returns 403,第一步应该是解析访问令牌。您可以为此使用 https://jwt.io(或任何其他 JWT 解析器)。您要确认以下内容:

  • aud 声明设置为 https://graph.microsoft.com
  • tid 声明是与您的 Office 365 租户的租户 ID 匹配的 GUID
  • 对于 app-only token(或者如你所说,"get access without a user"):roles 声明是一个范围的数组,你预计。在你的情况下,它应该包括 Mail.Send
  • 对于委托访问令牌(不是你的情况,但为了完整起见包含在此处):scp 声明是一个字符串,其中包含你期望的范围。

我的猜测是,您可能拥有一个根本没有 roles 声明的令牌,如果管理员未提供同意,就会发生这种情况。您可以通过检查 this section of the Azure article on client credential flow 来解决这个问题。

为了完整起见,除了提供的答案外,对于未来仍然遇到像我一样问题的用户,请注意以下几点:

  • MS Graph Explorer 不使用客户端凭证流(即传递应用程序客户端 ID 和应用程序客户端机密),而是使用其他一些流(也许有人可以评论到底是什么流)这意味着它不会代表您的应用程序(假设您的应用程序使用客户端凭证流)。

  • 如果您使用的是客户端凭证流,请确保查询正确的 API 端点(与 Graph Explorer 中的端点不同!)否则您将不断收到 403 错误.

奖金

  • 对于解析令牌,以下网站提供了更多信息:https://jwt.ms
  • 要验证您的应用程序,请尝试改用 Postman 或 cURL。获取 cURL 参数的一种快速方法是通过在 Graph Explorer 上发送触发 `sendMail 查询,然后将 HTTP 请求复制为 cURL(如果您的浏览器支持它)(见下文)。