【问题标题】:SharePoint Error using Office 365 REST API OAuth access_token使用 Office 365 REST API OAuth access_token 时出现 SharePoint 错误
【发布时间】:2015-04-05 23:14:43
【问题描述】:

我正在开发一个相当简单的应用程序,它使用 REST Office 365 API 从 SharePoint 检索文件。这是在后台运行的批处理作业,没有用户界面,因此我正在执行以下简单的两步流程:

(1) 从 Azure AD 请求访问令牌(提供客户端 ID、客户端密码、资源和 grant_type=client_credentials)

(2) 使用“Authorization: Bearer”作为请求标头调用 SharePoint API (https://{base url}/_api/v1.0/Files)。

这个过程看起来很简单,听起来很简单,但我不断收到以下错误:

401 Unauthorized

x-ms-diagnostics:  3001000;reason="There has been an error authenticating the request.";category="invalid_client"

知道问题是什么以及如何解决吗?我已经坚持了好几天了。我真的很感激有人在这方面的帮助。谢谢。

【问题讨论】:

    标签: rest azure oauth-2.0 office365


    【解决方案1】:

    SharePoint Online 尚不支持客户端使用仅限应用的令牌访问它(由客户端凭据 OAuth2 流产生)。它仅支持委托令牌,即用户+应用令牌(由授权代码 OAuth2 流产生)。

    因此,如果您希望编写访问 SharePoint Online 的客户端应用程序(Web 应用程序或本机客户端应用程序) - 它只能代表用户,并且必须涉及用户的交互式身份验证 - 在用户身份验证之后- 他们将看到一个同意页面,他们需要同意您的应用程序代表他们访问 O365 API。

    只有 Mail/Calendar/Contacts API (Exchange Online) 支持客户端使用仅限应用的令牌访问它们 - 他们最近已启用此支持。在此处阅读有关使用 Exchange Online API 的客户端凭据流令牌:http://blogs.technet.com/b/ad/archive/2015/02/04/using-azure-ad-to-build-daemon-applications-that-call-office-365-apis.aspxhttp://blogs.msdn.com/b/exchangedev/archive/2015/01/22/building-demon-or-service-apps-with-office-365-mail-calendar-and-contacts-apis-oauth2-client-credential-flow.aspx

    希望这会有所帮助。

    ps:OAuth2 客户端凭据流不会发出刷新令牌

    【讨论】:

      【解决方案2】:

      您将需要您尝试访问的特定资源的访问令牌 - 在这种情况下,您需要 Office365 REST API 的共享点站点。

      可以在此处找到有关此内容的好读物:https://msdn.microsoft.com/en-us/library/azure/dn645538.aspx

      假设您的 {base_url} 是一个共享点站点,即 'https://[site_name]-my.sharepoint.com

      您可以:

      (1) 最初使用您的客户端凭据和资源 = {base url}

      获取访问和刷新令牌

      (2) 从 Azure AD 资源获得访问和刷新令牌后,使用以下命令调用 refresh_token:

      • client_id
      • client_secret
      • grant_type = 'refresh_token'
      • 资源 = {base_url}
      • refresh_token = [从 Azure AD 接收到的刷新令牌 生成令牌响应]

      在这种情况下,您将拥有 2 个访问令牌:

      1. 可用于 Azure AD 请求的一种
      2. 可用于 Office365 REST Api 请求。

      我们无法/还没有找到一种方法让单个访问令牌对多个资源“有效”。

      希望这会有所帮助!

      【讨论】:

      • 这是我遇到的问题。我使用“上面的方法 #1”并提供 client_id、client_secret、grant_type="client_credentials" 和 resource={base_url} 并收到包含“access_token”但不包含 refresh_token 的响应。当我尝试使用该 access_token 从带有“Authentication: Bearer ”响应标头的 {base_url} 检索内容时,我没有收到上面提到的“invalid_client”错误。我正在使用msdn.microsoft.com/en-us/library/azure/dn645543.aspx 方法接收访问令牌,当我尝试 2 获取 SP 数据时该令牌失败
      • 我无法使用方法 #2,因为我从未使用此处描述的方法获得 refresh_token ...msdn.microsoft.com/en-us/library/azure/dn645543.aspx
      • 我使用 grant_type="authorization_code"。试试看。
      • 另外,我使用他们的身份验证“沙盒”来处理整个过程,因为它显示了身份验证和授权过程的每个步骤所需的所有参数。这是沙盒的链接:oauthplay.azurewebsites.net
      • 如果我使用 grant_type="authorization_code" 而不是 "c​​lient_credentials" 并保留 client_id、client_secret 和资源,因为我收到错误:“请求正文必须包含以下参数:'code' 。” .我没有代码,所以不知道该值应该是什么。我整个星期都在努力解决这个问题。文档和实际工作方式之间肯定存在差距。我真的真的需要弄清楚这一点。我认为这是一件小事,但我找不到任何文档来给我答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多