【问题标题】:Microsoft Graph Resumable Upload URL Returning V2 OneDrive API Upload URLMicrosoft Graph 可恢复上传 URL 返回 V2 OneDrive API 上传 URL
【发布时间】:2017-07-19 18:03:24
【问题描述】:

我正在尝试使用 Microsoft Graph API 通过 REST 调用创建可恢复的上传,我可以收到一个上传 URL 作为回报。但是,它一点也不像文档 URL,而且似乎是一个“较旧”的非 Graph v2.0 API

https://dev.onedrive.com/items/upload_large_files.htm

在示例中,返回 URL 是

https://sn3302.up.1drv.com/up/fe6987415ace7X4e1eF866337

但是,我收到的是:

https://{server}/_api/v2.0/drive/items/01LFLHCDPPDY5LDTR3UREILVK4ISP2HJIE/uploadSession?guid='031a05ef-806e-4118-a5ff-8dea9b558c3e'&path='~tmp8B_test.xls'&overwrite=True&rename=False

这与 OneDrive API 的差异一致。 https://dev.onedrive.com/direct-endpoint-differences.htm

但会导致 401 Unauthorized 响应,错误为

类型异常 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' 被扔了。”

我认为这是因为身份验证不同,并且当我将“Authorization: Bearer {accesstoken}”放在标头中时,我的 MS-Graph 访问令牌无效(该标头适用于所有我通过 Graph 进行的其他 REST 调用)

如何获取图表上传 URL 以将我的文件上传到 OneDrive Business?或者如何让返回 URL 起作用,以便上传到 OneDrive Business

编辑:显示权限

这是我从 app.developers 获得的权限

这里是我创建访问令牌的地方

request.setEndpoint('https://login.microsoftonline.com/{tenantID}/oauth2/v2.0/token');
        request.setHeader('Content-Type', 'application/x-www-form-urlencoded');
        string body;
        body = '&client_id={clientId}';
        body += '&scope=https%3A%2F%2Fgraph.microsoft.com%2F.default';
        body += '&client_secret={Secret}';
        body += '&grant_type=client_credentials';

这是我为上传会话进行 API 调用的地方(忽略语法):

webRequest.setEndPoint('https://graph.microsoft.com/v1.0/users/{myUserId}/drive/items/{parentItem_folder_Id}:/test.xls:/createUploadSession');
        webRequest.setHeader('Authorization', 'Bearer ' + getAccessToken());
        webRequest.setHeader('Content-Type', 'application/json');
        webRequest.setHeader('Accept', 'application/json');
        webRequest.setHeader('Host', 'graph.microsoft.com');
        webRequest.setHeader('Content-Length', '0');
        webRequest.setMethod('POST');

【问题讨论】:

  • 您能说明一下您的环境吗?您是在尝试使用 Microsoft Graph 创建可恢复的上传会话还是在使用 OneDrive API?这是两个独立的 API,您调用它们的方式也不同。另外,您使用的是纯 REST 还是 .NET SDK?
  • 感谢您的跟进。为了清楚起见,我编辑了我的问题。这是使用纯 REST 调用创建可恢复上传的 Graph API。我的偏好是尽可能多地使用 Graph
  • 我还添加了令牌刷新代码(适用于所有其他 REST 调用)和来自 apps.dev.microsoft.com 的权限
  • 我在发现这个问题上取得了一些进展,但它并没有解决问题:stackoverflow.com/questions/43656203/…
  • 您能否添加您正在发出的 HTTP 调用以请求上传 URI?它可能会有所帮助。

标签: onedrive sharepoint-api microsoft-graph-api


【解决方案1】:

我认为这里的问题是您尝试在没有用户的情况下上传文件(即仅应用程序而不是委托方案)。虽然您请求正确的范围 (Files.ReadWrite.All),但目前不支持此方案。来自documentation

注意:此 API 尚不支持 Files.ReadWrite.All 应用程序权限。计划很快提供全面支持。

目前,仅在委派场景(即用户已直接进行身份验证并正在上传到自己的驱动器的情况下)支持可恢复上传。

【讨论】:

  • 我可以通过简单上传方法上传:webRequest.setEndPoint('graph.microsoft.com/v1.0/users{myUser}/drive/items/{myfolderID}:/{MyFileName}:/content'); webRequest.setHeader('授权', '承载' + setaccesstoken()); webRequest.setHeader('Content-Type', 'text/plain'); webRequest.setHeader('接受', '应用程序/json'); webRequest.setHeader('Host', 'graph.microsoft.com'); webRequest.setHeader('Content-Length', string.valueOf(file.contentsize)); webRequest.setMethod('PUT');
  • 所以简单上传使用承载令牌、内容类型明文、接受 JSON、主机 graph.microsoft.com、内容长度
  • 啊啊啊啊!我明白你在说什么。对于实现 Files.ReadWrite.All 的简单上传,而对于可恢复(根据文档)它不是
  • 有没有可以看到路线图的地方?
  • 跟踪更改的最佳位置是Change Log。至于身份验证流程,您可能需要查看我不久前写的this post。这将引导您完成使用 v2 端点的核心“使用 Microsoft 登录”工作流程。
【解决方案2】:

401 错误是由于在尝试使用创建上传会话后返回的 URL 时使用“Authorization: Bearer”标头引起的。当您删除授权标头时,您可能仍然会收到错误消息。对我来说,这是一个 403 Forbidden 错误。

【讨论】:

  • 这是我得到的确切错误:System.HttpResponse[Status=FORBIDDEN, StatusCode=403]。你能解决这个问题吗?
  • 不,还没有。我刚刚提出了一个与删除上传会话有关的新问题。
  • 您的响应 URL 是在 2.0 OneDrive/Sharepoint API 中而不是 Graph 中吗?
  • 是的,它是“REDACTED.sharepoint.com/personal....”而不是“graph.microsoft.com/v1.0/drives...”。
  • 和我的一样。我希望在文档中获得图形 URL。我想远离可能会随着时间的推移而被贬低的 API。看起来 Graph 是未来的发展方向。我想知道为什么它会以这种方式返回?这是一个错误还是尚未实现的东西?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-30
  • 2023-03-11
  • 2016-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多