使用 Microsoft Graph api 代表企业用户阅读邮件

using microsoft graph api to read mail behalf of users in the enterprise

我正在尝试通过admin账号获取企业用户邮箱中的邮件。

在我的应用程序中,我拥有以下权限:

我使用 https://login.microsoftonline.com/common/adminconsent?... 授予应用程序读取所有邮箱中邮件的权限,之后,我使用 OAuth2 身份验证获取 Bearer 令牌。

这是我从令牌端点得到的响应:

{
  "token_type": "Bearer",
  "scope": "Mail.Read User.Read User.Read.All profile openid email",
  "access_token": "<token>",
  "expires_in": 3599,
  "ext_expires_in": 3599
}

当我使用它通过 https://graph.microsoft.com/v1.0/users/USER-ID/messages 访问邮箱时,我得到了以下响应

{
  "error": {
    "code": "ErrorAccessDenied",
    "message": "Access is denied. Check credentials and try again.",
    "innerError": {
      "request-id": "a31bcf73-4bd6-4fed-bfee-d70328e0703e",
      "date": "2018-11-26T15:20:37"
    }
  }
}

但是,当我将此端点与经过身份验证的管理员帐户的用户 ID 一起使用时,我能够访问该邮箱中的邮件。

但我想通过 Microsoft Graph 访问组织中所有用户 的邮箱。

Outlook 端点的运行方式与大多数 Graph 端点略有不同,而不是它们的范围有 .all 变化(即 user.readuser.read.all),这取决于正在使用哪种范围类型(​​委托与应用程序)。

使用委托范围时,Mail.Read 仅提供对经过身份验证的用户邮箱的访问权限(唯一的例外是那些已 明确与该用户共享 的邮箱) .

使用应用程序范围时,Mail.Read 提供对任何用户邮箱的访问。

现在,这就是事情变得有点不稳定的地方,应用的范围类型完全取决于用于获取令牌的 OAuth 授权

  • 使用隐式或授权代码授权时,将应用委托范围。
  • 使用客户端凭据授权时,会应用应用程序范围。

因此,为了让您通过 /v1.0/users/{someUser}/messages 访问任何用户的邮箱,您首先需要使用客户端凭据 OAuth 授权获取您的令牌。您可以在 "Get access without a user".

下的文档中找到有关其工作原理的演练