azure - OneDrive for Business API 发现和授权问题

标签 azure sharepoint office365 onedrive

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

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

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

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

值得一提的是,我们在第 2 步中遇到了问题,发现 OneDrive for Business 资源 URI 以及向 OneDrive API 发出请求

发现 OneDrive for Business 资源 URI 时出现问题

这部分流程的问题是,尽管我们使用第一个访问 token 访问api.office.com/discovery/v2.0/me/services在使用资源api.office.com/discovery/兑换后获得的strong>,我们没有进入 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 并检查我的 sharepoint url,它配置良好,并且我可以看到 {tenant}-my.sharepoint.com URI。

向 OneDrive API 发出请求时出现问题

此外,如果我对 URL 进行硬编码以使用我的租户共享点 URI 兑换下一个访问 token 请求,我无法发现正确的租户共享点 URI strong>,我正在获取访问 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。我认为我已经正确设置了权限。

最好,

列表项

最佳答案

可能有点晚了,但是这个 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/

相关文章:

azure - 为什么我们将 Azure 存储帐户链接到云服务?

css - 发布到 Azure 时未加载捆绑的 CSS

c# - 如何以编程方式打开 IE8 兼容性 View

sharepoint - 如何将 SharePoint 2010 列表表单从 InfoPath 重置为默认表单?

angularjs - Outlook 应用程序 - ADAL 身份验证 - AADSTS90056 : This endpoint only accepts POST requests

使用 ADAL 的 Azure AD OAuth 身份验证 : what's the resource ID?

azure - 为子 webconfig 设置 Azure Redis SessionState 提供程序

jquery - SP服务 : how to get a survey?

c# - 在 Android (Xamarin) 上实现 Office 365 API 的问题

c# - 如何获取 ServiceBusClient 的连接字符串?