Microsoft Graph 可续传上传 URL 返回 V2 OneDrive API 上传 URL

Microsoft Graph Resumable Upload URL Returning V2 OneDrive API Upload URL

我正在尝试使用 Microsoft Graph API 通过 REST 调用创建可续传上传,我可以在 return 中接收上传 URL。但是,它根本不像文档 URL,似乎是 "older" non-Graph v2.0 API

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

在示例中 return 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 响应,错误为

Exception of type 'Microsoft.IdentityModel.Tokens.AudienceUriValidationFailedException' was thrown."

我认为这是因为身份验证不同,当我将 'Authorization: Bearer {accesstoken}' 放入 [=64= 时,我的 MS-Graph 访问令牌无效](header 通过 Graph 适用于我的所有其他 REST 调用)

如何获取图形上传 URL 以将我的文件上传到 OneDrive Business?或者 如何让 return 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 上传 session(忽略语法):

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');

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

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

Note: The Files.ReadWrite.All application permission is not yet supported on this API. Full support is planned soon.

目前,仅在委托场景中支持可续传上传(即用户直接通过身份验证并上传到他们自己的驱动器)。