使用适当权限调用 Microsoft Graph API 时出现 403 错误

403 Error when making API call to Microsoft Graph with proper permissions

我正在尝试通过使用 Java 从我的 Web 应用程序调用 API 将联系人添加到 Azure。我已经能够使用相同的 API 呼叫设置添加用户、向用户添加许可证以及其他各种任务,没有任何问题。但是,添加联系人时,出现以下错误:

 Exception in thread "main" com.microsoft.graph.http.GraphServiceException: Error code: 
 ErrorAccessDenied
 Error message: Access is denied. Check credentials and try again.

 POST https://graph.microsoft.com/v1.0/me/contacts
 SdkVersion : graph-java/v2.3.2
 SdkVersion : graph-java/v2.3.2
 Authorization : [PII_REDACTED]
 {"businessPhones":["+1 212 212 2121"],"emailAddres[...]

 403 : Forbidden

我已确保所有正确的权限都已存在,并且在尝试进行故障排除时已授予该应用几乎所有权限。通过 Microsoft 的文档,我唯一能够看到的可能问题是它可能是一个“范围”问题,因为到目前为止所有的调用都是在这里进行的:

        ClientCredentialParameters parameters = ClientCredentialParameters
                .builder(Collections.singleton("https://graph.microsoft.com/.default")).build();

        CompletableFuture<IAuthenticationResult> future = app.acquireToken(parameters);

此外,当我使用图形资源管理器手动执行这些调用时,我得到了这样的响应:

"error": {
    "code": "MailboxNotEnabledForRESTAPI",
    "message": "REST API is not yet supported for this mailbox.",
    "innerError": {
        "date": "2021-01-22T17:09:37",
        "request-id": "***********************",
        "client-request-id": "*********************"
    }
}

您的想法是正确的,您正在使用基于守护进程的客户端凭据流来获取访问令牌,这是一个应用程序令牌。对于客户端凭证流,通常用于必须在后台 运行 并且不立即与用户交互(没有用户登录)的服务器到服务器交互。对于 /me 端点,它需要接受 用户令牌 ,因为它有用户交互。因此您不能使用应用程序令牌来调用 /me 端点。

最简单的方法是将 /me 端点更改为 /users endpoint:

https://graph.microsoft.com/v1.0/users/{id | userPrincipalName}/contacts

至于第二个错误:

“MailboxNotEnabledForRESTAPI - 此邮箱尚不支持 REST API” 此错误消息表示您用于发送邮件的电子邮件帐户电子邮件没有 Exchange Online 许可证。您需要 assign licenses to users: