【问题标题】:OneDrive for Business API issues on Discovery and Authorization关于发现和授权的 OneDrive for Business API 问题
【发布时间】:2016-02-18 14:51:50
【问题描述】:

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

首先要做的是处理 OAuth2 身份验证以获取正确的令牌,首先发现 {tenant}-my.sharepoint.com 特定租户 OneDrive 业务 URI,然后获取该租户的令牌。可以找到用于此目的的文档here。

按照该教程,我们能够做到以下几点:

  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 strong> 使用资源 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
} ]
}

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

向 OneDrive API 发出请求的问题

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

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。我认为我的权限设置正确。

最好的,

列表项

【问题讨论】:

  • 您能否确认发现服务的响应是针对 /services 而不是 /allServices?
  • 没关系,显然查询“/services”会返回“allServices”的@odata.context...这有点奇怪。
  • 您是如何获取访问令牌来调用发现服务的? Discovery 服务本身正在返回 Active Directory 帐户和 Microsoft 帐户的服务信息对象(serviceAccountType:1 表示 MSA,2 表示 Active Directory。您在哪个平台上?如果您是 iOS、.net 或 Andriod,OneDriveSDK 将处理所有这个给你
  • 我们正在开发自己的 Java 实现。它是一个后端应用程序
  • 您好 alev,我们在此处根据 OneDrive for Business 文档 API dev.onedrive.com/auth/aad_oauth.htm 获取访问令牌。除此之外,我在此处进行身份验证的用户是具有 E3 企业许可证的用户,如果我使用此用户登录到门户 Office 365,我会看到 OneDrive for Business 已激活。事实上,我可以在这个用户中访问 OneDrive for Business,访问 https://{mytenant}-my.sharepoint.com/persona/{user}

标签: azure sharepoint office365 onedrive


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多