2

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

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

对于身份验证,我们使用“无需用户即可访问”的方式。

我们通过此 url 接收令牌: https ://login.microsoftonline.com/our_tenant/oauth2/v2.0/token 和正文如下所示:

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

使用此链接发送邮件:

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

在带有电子邮件对象的正文 json 中。

当我们通过这种方法发送电子邮件时,会收到带有文本“访问被拒绝。检查凭据并重试”的响应代码“403”。

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

此致

4

2 回答 2

5

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

  • aud索赔设置为https://graph.microsoft.com
  • tid声明是与您的 Office 365 租户的租户 ID 匹配的GUID
  • 对于仅限应用程序的令牌(或者如您所说,“无需用户即可访问”):roles声明是您期望的范围数组。在你的情况下,它应该包括Mail.Send
  • 对于委派的访问令牌(不是您的情况,但为了完整性而包含在此处):scp声明是一个包含您期望的范围的字符串。

我的猜测是,您可能拥有一个根本没有roles声明的令牌,如果管理员没有提供同意,就会发生这种情况。您可以通过查看有关客户端凭据流的 Azure 文章的这一部分来解决此问题。

于 2018-03-01T13:48:51.247 回答
1

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

奖金

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

浏览器中的快速 cURL

于 2021-04-28T19:47:39.380 回答