【问题标题】:Office 365 unified API (preview) requests 401 errorOffice 365 统一 API(预览版)请求 401 错误
【发布时间】:2015-10-16 22:08:39
【问题描述】:

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

【问题讨论】:

  • 您能否添加有关您要添加的特定范围的更多信息?要访问用户的信息,需要 User.Read(至少)。要访问用户的文件,您需要 Files.Read。目前您将无法上传大文件,该功能即将推出。
  • 我尝试添加所有范围,但它不起作用。
  • 您好 Kardanov,您能告诉我以下链接是否适合您吗? graphexplorer2.azurewebsites.net/…
  • 嗨 Kardanov - 您选择的新权限是否显示在访问令牌中?您需要的权限是 Files.Read(每个 Yina)和 User.Read(登录并读取用户配置文件)。这个问题是否已解决或仍然存在?
  • 丹,肖恩:看到同样的错误。在 JSON 中,我有“范围”:“MyFiles.Read MyFiles.Write Userprofile.Read”我已经尝试了所有复选框组合,要么同意失败,要么成功,但我似乎无法获得适用的令牌统一 API 或 SharePoint Online API。是否有任何文档简单地说“使用 sharepoint api 编写添加此应用程序并选中此框?”因为那将是一个巨大的帮助:我今天花了几个小时试图弄清楚什么神奇的权限组合会给我我需要的东西。

标签: office365 azure-active-directory onedrive office365api


【解决方案1】:

今天早些时候遇到完全相同的问题:总是得到 401 Unauthorized 或其他错误。然后我遇到了这个答案:Building a multi-tenant app for 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. 使用设置为第 1 步中收到的令牌的授权标头调用 url https://api.office.com/discovery/v2.0/me/services"。这将返回一个带有 value 字段的 JSON 对象。 value 字段将是一个服务数组,此代码将为其返回访问令牌。value 数组中的每个对象都有一个 serviceResourceId 属性。
  3. 对于每个对象,您必须使用在步骤 #1 中使用的相同代码获取另一个访问令牌,但资源设置为 serviceResourceId。

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

【讨论】:

  • 非常感谢您的回答!
  • 附带说明,尽管我说的是本地部署,但那里可能有一些共同点,在 ASP.NET 上你可以做同样的事情,因为默认情况下它不保护对抗重放攻击。您需要专门启用令牌重放检测msdn.microsoft.com/en-us/library/jj161103(v=vs.110).aspx
【解决方案2】:

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

Fiddler 中返回的支持类型 '应用程序/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'

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多