首页 文章

有关发现和授权的OneDrive for Business API问题

提问于
浏览
12

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

第一个显而易见的事情是处理OAuth2身份验证以获取正确的令牌,首先发现 -my.sharepoint.com特定的租户OneDrive业务URI,然后获取该租户的令牌 . 为此目的的文件可以找到here .

在该教程之后,我们能够执行以下操作:

  • 在Azure AD中注册应用程序 . Done

  • 登录OneDrive for Business

  • 登录并获取授权码 . Done

  • 兑换令牌的授权码 . Done

  • 发现OneDrive for Business资源URI . FAIL

  • 为访问令牌兑换刷新令牌以调用OneDrive API . Done

  • 向OneDrive API发出请求 . FAIL

可以理解,我们在第2步 Discover the OneDrive for Business resource URIMake a request to the OneDrive API 上遇到了问题 .

发现OneDrive for Business资源URI的问题

这部分过程的问题是,尽管我们在使用资源 api.office.com/discovery/ 进行兑换后获得了第一个 Access Token ,但是我们没有进入OneDrive for Business的服务租户特定共享点URI列表 . 列表中的任何条目我们都会根据文档提供 capability = "MyFiles" AND serviceApiVersion = "v2.0" . 事实上,列表中的任何条目在serviceEndpointUri中都具有 -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并检查我的sharepoint网址,它配置得很好,我可以看到 -my.sharepoint.com URI .

问题向OneDrive API发出请求

除了我无法发现正确的 tenant sharepoint URI ,如果我硬编码URL以使用我的 tenant sharepoint URI 兑换下一个 Access Token 请求,我将获得一个访问令牌,但是当我想打电话给例如 https://{tenant}-my.sharepoint.com/drive/root 或任何其他 endpoints 我得到401即使刚刚获得令牌,也不会对每次通话中的响应进行授权 . 这是一个握手的例子 . 我隐藏敏感数据:

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 App中是否缺少某些配置?

顺便说一句,我在每次兑换时获得的应用程序的权限范围都是 AllSites.FullControl AllSites.Manage MyFiles.Write Sites.Search.All TermStore.ReadWrite.All User.Read.All . 我认为我有权限正确设置 .

最好,

项目清单

1 回答

  • 0

    可能会有点晚,但是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();
    

相关问题