我一直在尝试根据这个 OneDrive Release Notes 实现 OneDrive Business API。我们已经实现了 OneDrive 最终用户 API,没有任何问题。

显而易见的第一件事是处理 OAuth2 身份验证以获取正确的 token ,首先发现 {tenant}-my.sharepoint.com 特定租户 OneDrive Business URI,然后获取该租户的 token 。可以找到用于该目的的文档 here

按照该教程,我们已经能够执行以下操作:

  • 在 Azure AD 中注册应用程序。 完成
  • 登录 OneDrive for Business
  • 登录并获取授权码。 完成
  • 兑换 token 的授权码。 完成
  • 发现 OneDrive for Business 资源 URI。 失败
  • 兑换刷新 token 以获得访问 token 以调用 OneDrive API。 完成
  • 向 OneDrive API 发出请求。 失败

  • 可以理解的是,我们在第 2 步中遇到了问题, 发现 OneDrive for Business 资源 URI 向 OneDrive API 0x25181914213 发出请求。

    发现 OneDrive for Business 资源 URI 的问题

    这部分过程的问题是,虽然我们在 api.office.com/discovery/v2.0/me/services 与第一个 获得的访问 token 10x21212121212121212121212121121212121212121212121121214212121421212142141214212121421214111421411142121411142141114214111421411411142之后获得1411142后/discovery/ ,我们没有进入 OneDrive for Business 的服务租户特定共享点 URI 列表。根据文档,我们得到的列表中的任何条目都带有 capability = "MyFiles" AND serviceApiVersion = "v2.0"。事实上,列表中的任何条目在 serviceEndpointUri 中都具有 {tenant}-my.sharepoint.com 结构。这是我回来的 JSON 响应。我删除了一些敏感数据:
    {
    "@odata.context" : "https://api.office.com/discovery/v2.0/me/$metadata#allServices",
    "value" : [ {
      "capability" : "Directory",
      "providerName" : "Microsoft",
      "serviceAccountType" : 2,
      "serviceApiVersion" : "",
      "serviceEndpointUri" : "http://azure.microsoft.com/",
      "serviceName" : "Microsoft Azure",
      "serviceResourceId" : null
    }, {
      "capability" : "MyFiles",
      "providerName" : "Microsoft",
      "serviceAccountType" : 2,
      "serviceApiVersion" : "",
      "serviceEndpointUri" : "http://www.microsoft.com/en-us/office365/online-software.aspx",
      "serviceName" : "Office 365 SharePoint",
      "serviceResourceId" : null
    }, {
      "capability" : "RootSite",
      "providerName" : "Microsoft",
      "serviceAccountType" : 2,
      "serviceApiVersion" : "",
      "serviceEndpointUri" : "http://www.microsoft.com/en-us/office365/online-software.aspx",
      "serviceId" : "O365_SHAREPOINT",
      "serviceName" : "Office 365 SharePoint",
      "serviceResourceId" : null
    }, {
      "capability" : "MyFiles",
      "providerName" : "Microsoft",
      "serviceAccountType" : 1,
      "serviceApiVersion" : "",
      "serviceEndpointUri" : "https://g.live.com/8seskydrive/HomePageUrl",
      "serviceName" : "OneDrive",
      "serviceResourceId" : null
    } ]
    }
    

    问题是如果我登录到我的 portal.office.com 并检查我的共享点 URL,它配置良好,我可以看到 {tenant}-my.sharepoint.com URI。

    关于向 OneDrive API 发出请求的问题

    除了我不能够发现正确租户的SharePoint URI ,如果我硬编码的URL赎回下一访问 token 要求与我租户的SharePoint URI ,我得到的访问 token ,但是当我想打一个电话以 https://{tenant}-my.sharepoint.com/drive/root 或任何其他端点为例,我在每次调用中都会收到 401 Unauthorize 响应,即使刚刚获得 token 也是如此。这是一个握手的例子。我正在隐藏敏感数据:
    curl -v 'https://{tenant}-my.sharepoint.com/drives' -H 'Authorization:   Bearer TOKEN_ACQUIRED'
    Connected to {tenant}-my.sharepoint.com port 443
    GET /drives HTTP/1.1
    Host: {tenant}-my.sharepoint.com
    Authorization: Bearer TOKEN_ACQUIRED
    
    HTTP/1.1 401 Unauthorized
    

    你能给我建议吗?我的租户中是否缺少某些配置?我的 Azure AD 应用程序中是否缺少某些配置?

    顺便说一句,我每次兑换的应用程序的权限范围是 AllSites.FullControl AllSites.Manage MyFiles.Write Sites.Search.All TermStore.ReadWrite.All User.Read.All 。我想我已经正确设置了权限。

    最好,

    项目 list

    最佳答案

    可能有点晚了,但是这个 blog article 解决了如何使用 OneDrive API 和 OneDrive for Business API 完全相同。
    这是一个快速的 Java 代码片段:

    CloudRail.setAppKey("[CloudRail License Key]");
    
    // CloudStorage cs = new OneDrive(redirectReceiver, "[clientIdentifier]", "[clientSecret]", "[redirectUri]", "[state]");
    CloudStorage cs = new OneDriveBusiness(redirectReceiver, "[clientID]", "[clientSecret]", "[redirectUri]", "[state]");
    
    new Thread() {
        @Override
        public void run() {
            cs.createFolder("/TestFolder");
            InputStream stream = null;
            try {
                stream = getClass().getResourceAsStream("Data.csv");
                long size = new File(getClass().getResource("Data.csv").toURI()).length();
                cs.upload("/TestFolder/Data.csv", stream, size, false);
            } catch (Exception e) {
                // TODO: handle error
            } finally {
                // TODO: close stream
            }
        }
    }.start();
    

    关于azure - OneDrive for Business API 发现和授权问题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33753471/

    10-13 01:33