0

我正在尝试使用 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 Unauthorized。

我究竟做错了什么?

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

4

2 回答 2

2

所以今天早些时候遇到了完全相同的问题:总是得到 401 Unauthorized 或其他错误。然后我遇到了这个答案:为 SharePoint Online O365 构建多租户应用程序

就是这样:这非常违反直觉,但答案是在获取发现 URL 的令牌并执行服务发现后,您需要为要调用的每个 serviceResourceId 获取令牌。这里有两个非常重要的点,几乎 8 小时的阅读文档并没有清楚地说明。

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

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

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

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

我再说一遍:在整个 Internet 上,您实际上无法多次使用相同的 OAuth2 代码来检索访问令牌。这是应该在文档中突出显示的内容,而根本不是。

如果您仍然遇到此问题,您应该使用返回的 OAuth2 代码执行此操作:

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

第 3 步中的代码实际上将授予您访问所需租户端点的权限。3.

于 2015-07-31T03:36:10.227 回答
0

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

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=详细

于 2015-07-28T10:48:14.360 回答