当前位置: 首页 > 知识库问答 >
问题:

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

闻人德庸
2023-03-14

我正在尝试使用URL登录用户“https://login.windows.net/common/oauth2/authorize?response_type=code

一切都很好。

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

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

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

我做错了什么?

关于使用统一API的可能性的问题。我的目标是上传大文件(最大1GB)。使用统一API可能吗?我在留档中找不到任何东西,但我发现OneDrive for Business API不可能(最大文件大小为100MB)。

共有2个答案

斜单鹗
2023-03-14

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

Fiddler的application/json中返回的支持类型;odata.metadata=最小;奥达塔。流=真;IEEE754Compatible=false,application/json;odata.metadata=最小;奥达塔。流=真;IEEE754Compatible=true,application/json;odata.metadata=最小;奥达塔。streaming=true,application/json;odata.metadata=最小;奥达塔。流=假;IEEE754Compatible=false,application/json;odata.metadata=最小;奥达塔。流=假;IEEE754Compatible=true,application/json;odata.metadata=最小;奥达塔。streaming=false,application/json;奥达塔。元数据=最小;IEEE754Compatible=false,application/json;奥达塔。元数据=最小;IEEE754Compatible=true,application/json;奥达塔。元数据=最小,application/json;odata.metadata=已满;奥达塔。流=真;IEEE754Compatible=false,application/json;odata.metadata=已满;奥达塔。流=真;IEEE754Compatible=true,application/json;odata.metadata=已满;奥达塔。streaming=true,application/json;odata.metadata=已满;奥达塔。流=假;IEEE754Compatible=false,application/json;odata.metadata=已满;odata.streaming=假;IEEE754Compatib…'与任何可接受的MIME类型的application/json不匹配;odata=详细'

聂煜
2023-03-14

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

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

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

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

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

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

我会再说一遍:在整个互联网上的任何其他地方,您都不能多次使用相同的OAuth2代码来检索访问令牌。这是一件应该在文档中明确指出的事情,但事实并非如此。

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

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

第3步中的代码将实际授权您访问您想要的租户endpoint。3.

 类似资料:
  • 您如何访问旧 API? 在我的azure帐户中,我有Office 365统一API(预览版),我希望使用旧的API,因为它处于预览版,文档不完整,运行缓慢。 但是,在我的azure帐户中,我只有Office 365统一API(预览版)、Office 365管理API

  • 尝试将权限添加到我的Azure AD管理门户中的“Office 365统一API(预览)”,然后保存时,我总是收到错误: “无法使用以下详细信息更新应用程序“”的配置: “请再试一次。如果问题仍然存在,请联系支持人员。 我尝试了2天,它不起作用。我无法联系支持人员,因为我正在使用Azure试用版来测试此软件。这是怎么回事?有什么想法吗?我真的很想测试此软件的潜力。 “Office 365管理API

  • 我正在为一家伍迪商店做一个离子2项目。我在我的应用程序中使用WooCommerce REST API,并使用PostmanChrome应用程序使用OAuth-1.0测试API。我收到了GET请求的正确响应,但对于POST请求,我收到了签名不匹配的错误,因为:

  • 我在将curl请求转换为python代码请求时遇到了麻烦。 工作卷曲请求 卷曲-X柱“http://xxxxxx“-H”accept:application/json“-H”内容类型:application/x-www-form-urlencoded“-H”授权:令牌882a6ec053ff6dbac623eff400f67c0bb6ade399“-d”name=namename” 不工作pyth

  • 我有一个在Azure网站上运行的标准Web API,启用了Azure AD身份验证,当在浏览器中浏览API时,我可以通过浏览器登录并获得对API的访问权。 但是,WPF桌面应用程序在提交请求时接收到未经授权的响应: 更新: 我已经在一个Azure帐户中重新创建了这个环境,我可以访问这个帐户,但仍然收到一个未经授权的响应(在浏览器中运行良好)。