【问题标题】:Microsoft Graph API - error 403 "Insufficient privileges to complete the operation"Microsoft Graph API - 错误 403“权限不足,无法完成操作”
【发布时间】:2021-03-26 09:25:38
【问题描述】:

我正在尝试使用 R 包的 AzureR 系列通过 Graph API 与 Outlook 进行交互。使用 Microsoft365R 我有以下代码:

outl <- get_business_outlook(
  tenant = tenant_id,
  app = client_id,
  password = client_secret
)

但这会导致 403 错误:

process_response(res, match.arg(http_status_handler), simple) 中的错误: 禁止 (HTTP 403)。未能完成操作。信息: 权限不足,无法完成操作。

相关应用具有 API 权限 Mail.ReadWrite、Mail.ReadWriteShared、Mail.Send、Mail.Send.Shared、offline_access、openid、User.Read。

我也试过直接使用 AzureGraph 包:

login <- create_graph_login(
  tenant = tenant_id,
  app = client_id,
  password = client_secret
)

这行得通,我得到了一个令牌。然后我尝试使用me &lt;- login$get_user() 提取用户信息,但这会引发与上述相同的 403 错误。我怀疑我需要做一些事情来对用户进行实际身份验证,但我真的不知道是什么。

我对 Graph API 完全陌生,所以我很可能错过了一些明显的东西。任何帮助表示赞赏!

【问题讨论】:

  • 通过将访问令牌放入jwt.ms 来检查您的访问令牌,并查看您是否拥有具有上述所有权限的“scp”声明。
  • @ShivaKeshavVarma 您好,访问令牌中没有此类信息。
  • accessToken 中应该有权限,只有使用 'scp' 声明它才会了解您是否被授权,并且需要调用 Graph API。见docs.microsoft.com/en-us/graph/auth/auth-concepts
  • 我显然可以访问该应用程序,因为我有秘密并得到了一个令牌,但我想我不明白我是如何授权自己的。创建登录时,我尝试指定范围,但随后出现“范围无效”的错误。
  • 是的,这就是@ShivaKeshavVarma 上面所说的。如果您想访问受保护的资源(例如 Microsoft Graph),则需要获取具有所需权限/范围的令牌。只是为了隔离问题,您可以使用 Microsoft Graph Explorer,以同一用户身份登录,调用相同的 Graph API 调用,它将为您工作。您可以复制令牌,使用jwt.ms 验证相同的令牌(或者您可能想将其与您的令牌进行比较)...!!

标签: r microsoft-graph-api


【解决方案1】:

Microsoft365R/AzureGraph 作者在这里。在您显示的代码中,无论是get_business_onedrive()create_graph_login(),您都在以应用程序身份验证,而不是以用户身份进行身份验证。这意味着不涉及任何用户帐户,因此您无法查看用户详细信息或发送电子邮件。

要以用户身份进行身份验证,请运行

# Microsoft365R
get_business_outlook("tenant_id", app="client_id")

# AzureGraph
create_graph_login("tenant_id", app="client_id")

即,没有password 参数。如果 R 打开一个浏览器窗口让您登录到 Azure(或显示它已成功登录),您应该知道它正在工作。

AzureAuth 包的最新版本有一个vignette,它对各种身份验证方案进行了更多解释。 AzureAuth::get_azure_token 是 Microsoft365R 和 AzureGraph 用于获取 OAuth 令牌的底层函数,您可以从 get_business_outlookcreate_graph_login 传递小插图中提到的参数。

【讨论】: