Office 365统一API(预览版)请求401错误

Office 365 unified API (preview) requests 401 error

我正在尝试使用统一的 Office 365 API(预览版)做一些有趣的事情,并在获得授权的情况下停滞不前。 我制作了具有我需要的所有权限的应用程序

我正在尝试使用 URL 登录用户 “https://login.windows.net/common/oauth2/authorize?response_type=code&client_id={CLIENT_ID}&resource=https://graph.microsoft.com/

一切都很好。

我什至可以通过 https://login.windows.net/common/oauth2/token 的请求获得所有范围的 access_token。

但是!我有问题,我无法获取有关用户的任何信息,也无法获取他的文件。

我试着提出这样的要求:

我总是得到 HTTP 状态 401 未经授权。

我做错了什么?

还有 关于统一 API 的可能性的问题。我的目标是上传大文件(最大 1GB)。统一 API 有可能吗?我在文档中找不到任何内容,但我发现 OneDrive for Business 无法实现 API(最大文件大小为 100MB)。

我会尝试将 "Accept" header 更改为 "application/json;odata.metadata=minimal"。 odata.metadata=none 未出现在统一 API 支持的 MIME 类型列表中。

Fiddler 中返回的支持类型 'application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=false, application/json;odata.metadata=minimal;odata.streaming=true;IEEE754Compatible=true, application/json;odata.metadata=minimal;odata.streaming=true, application/json;odata.metadata=minimal;odata.streaming=false;IEEE754Compatible=false, application/json;odata.metadata=minimal;odata.streaming=false;IEEE754Compatible=true, application/json;odata.metadata=minimal;odata.streaming=false, application/json;odata.metadata=minimal;IEEE754Compatible=false, application/json;odata.metadata=minimal;IEEE754Compatible=true, application/json;odata.metadata=minimal, application/json;odata.metadata=full;odata.streaming=true;IEEE754Compatible=false, application/json;odata.metadata=full;odata.streaming=true;IEEE754Compatible=true, application/json;odata.metadata=full;odata.streaming=true, application/json;odata.metadata=full;odata.streaming=false;IEEE754Compatible=false, application/json;odata.metadata=full;odata.streaming=false;IEEE754Compatib...' 不匹配任何可接受的 MIME 类型 'application/json; odata=verbose'

所以今天早些时候遇到了完全相同的问题:总是遇到 401 未经授权或其他错误。然后我 运行 跨过这个答案:Building a multi-tenant app for SharePoint Online O365

就是这样:它非常 counter-intuitive 但答案是在获得用于发现的令牌 URL 并执行服务发现之后,您需要为您想要的每个 serviceResourceId 获取令牌打电话。这里有两个非常重要的点,将近 8 小时的阅读文档并没有明确说明。

每个服务资源 ID 都有不同的令牌

第一点非常令人困惑:我假设它是这样做的,因为各个租户应用程序 运行 在不同的集群上,并且 Microsoft 已选择不提供单一授权服务。 multi-tenant 的每个其他实现(例如,Google Apps 实现)都会为您提供一个令牌,将您的所有权限包装到一个球中。

您可以使用同一代码多次调用令牌检索服务

这是令人难以置信的 counter-intuitive(我故意使用粗体大写)。 Internet 上的其他任何地方都没有其他 OAuth2 服务(我个人编写了轻松 30 个 OAuth2 实现的代码),您可以使用相同的代码多次调用令牌检索服务而不会收到错误。这完全违背了所有默认预期,并且它是一个主要的文档失败,它没有更清楚地说明为偏离标准实践。

我再说一遍:在整个 Internet 上没有其他地方可以实际多次使用相同的 OAuth2 代码来检索访问令牌。这是应该在文档中突出显示的内容,但根本不是。

如果您仍然遇到此问题,您应该使用 OAuth2 代码 returned:

  1. 使用代码获取访问令牌令牌并添加请求参数"resource" = "https://api.office.com/discovery/"(结束斜杠很重要)
  2. 调用 url https://api.office.com/discovery/v2.0/me/services" 使用授权 header 设置为在步骤 #1 中收到的令牌。这将 return JSON object,带有 value 字段。值字段将是此代码将 return 访问令牌的服务数组for.value数组中的每个object都会有一个serviceResourceId属性.
  3. 对于每个 object,您将必须使用您在步骤 #1 中使用的相同代码获取另一个访问令牌,但资源设置为 serviceResourceId。

步骤 #3 中的代码实际上会让您运行t 访问所需的租户端点。 3.