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

Jua*_*uan 12 sharepoint azure office365 onedrive

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

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

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

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

可以理解,我们在第2步,发现OneDrive for Business资源URI向OneDrive API发出请求时遇到了问题.

发现OneDrive for Business资源URI的问题

与过程的这一部分的问题是,虽然我们打至api.office.com/discovery/v2.0/me/services与第一访问令牌得到资源后赎回api.office.com/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
} ]
}
Run Code Online (Sandbox Code Playgroud)

这个问题是,如果我登录到我的portal.office.com并检查我的sharepoint网址,它配置得很好,我可以看到{tenant} -my.sharepoint.com URI.

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

除了我无法发现正确的租户共享点URI,如果我硬编码URL以使用我的租户共享点URI兑换下一个访问令牌请求,我将获得访问令牌,但是当我想要拨打电话时,例如或任何其他端点即使刚刚获得令牌,我也会在每次通话中获得401 Unauthorize响应.这是握手示例.我隐藏了敏感数据:https://{tenant}-my.sharepoint.com/drive/root

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
Run Code Online (Sandbox Code Playgroud)

你能告诉我这件事吗?我的租户中是否缺少某些配置?我的Azure AD应用程序中是否缺少某些配置?

顺便说一下,我的App上的权限范围我在每次兑换中都有AllSites.FullControl AllSites.Manage MyFiles.Write Sites.Search.All TermStore.ReadWrite.All User.Read.All.我认为我有权限正确设置.

最好,

项目清单

小智 -1

可能有点晚了,但这篇博客文章介绍了如何使用 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();
Run Code Online (Sandbox Code Playgroud)