Проблемы с API OneDrive для бизнеса при обнаружении и авторизации

Я пытался реализовать OneDrive Business API в соответствии с этими примечаниями к выпуску OneDrive . Мы уже внедрили API для конечных пользователей OneDrive без каких-либо проблем.

Первое, что нужно сделать, это обработать аутентификацию OAuth2, чтобы получить нужные токены, сначала обнаружив {tenant} -my.sharepoint.com URI конкретного клиента OneDrive Business, а затем получив токены для этого клиента. Соответствующую документацию можно найти здесь.

Следуя этому руководству, мы смогли сделать следующее:

  1. Зарегистрируйте приложение в Azure AD. Готово
  2. Sign into OneDrive for Business
    • Log in and get an authorization code. Done
    • Погасите код авторизации на токены. Готово
    • Откройте для себя URI ресурса OneDrive для бизнеса. НЕ ИСПОЛЬЗУЕТСЯ
    • Активируйте токен обновления для токена доступа для вызова API OneDrive. Готово
    • Сделайте запрос к API OneDrive. НЕ ИСПОЛЬЗУЕТСЯ

Понятно, у нас возникли проблемы на шаге 2, Найдите URI ресурса OneDrive для бизнеса и Сделайте запрос к API OneDrive .

Проблема при обнаружении URI ресурса OneDrive для бизнеса

Проблема с этой частью процесса заключается в том, что, хотя мы обращаемся к api.office.com/discovery/v2.0/me/services с первым полученным токеном доступа после погашения с помощью ресурса api.office.com/discovery/ мы не попадаем в список URI точки доступа для конкретного клиента службы для OneDrive для бизнеса. Любая запись в списке, который мы получаем, сопровождается capability = "MyFiles" AND serviceApiVersion = "v2.0" соответствующей документацией. Фактически любая запись в списке имеет структуру {tenant} -my.sharepoint.com в serviceEndpointUri. Я получаю ответ в формате 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-адреса sharepoint, он хорошо настроен, и я вижу URI {tenant} -my.sharepoint.com.

Проблема при отправке запроса к API OneDrive

Кроме того, я не могу обнаружить правильный URI точки доступа клиента, если я жестко закодирую URL-адрес для погашения следующего запроса токена доступа с помощью моего URI точки доступа клиента, Я получаю токен доступа, но когда я хочу позвонить, например, в 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. Я думаю, что у меня правильно установлены разрешения.

Лучший,

Пункт списка


person Juan    schedule 17.11.2015    source источник
comment
Можете ли вы подтвердить, что ответ от службы обнаружения был для / services, а не / allServices?   -  person Brad    schedule 19.11.2015
comment
Неважно, очевидно, что запрос / services возвращает @ odata.context для allServices ... это немного странно.   -  person Brad    schedule 19.11.2015
comment
Как вы получили токен доступа для вызова службы обнаружения? Сама служба обнаружения возвращает объекты служебной информации как для учетных записей Active Directory, так и для учетных записей Microsoft (serviceAccountType: 1 означает MSA, а 2 означает Active Directory. На какой платформе вы работаете? Если вы используете iOS, .net или Andriod, OneDriveSDK будет обрабатывать все это для тебя   -  person aclev    schedule 19.11.2015
comment
Мы разрабатываем собственную реализацию, написанную на Java. Это серверное приложение   -  person Juan    schedule 20.11.2015
comment
Привет, aclev, мы получаем токен доступа в соответствии с API документации OneDrive для бизнеса здесь dev.onedrive.com/auth/ aad_oauth.htm. Кроме того, пользователь, которого я здесь аутентифицирую, является пользователем с корпоративной лицензией E3, и если я вошел с этим пользователем на портал Office 365, я вижу, что OneDrive для бизнеса активирован. Фактически, я мог получить доступ к OneDrive для бизнеса под этим пользователем, перейдя по адресу https: // {mytenant} -my.sharepoint.com/persona/ {user}.   -  person Juan    schedule 20.11.2015
comment
Есть мысли о том, что я делаю не так?   -  person Juan    schedule 20.11.2015
comment
какой ресурс вы использовали для получения токена доступа? (на 2-м шаге при погашении токена доступа из кода авторизации.)   -  person npradeep357    schedule 29.07.2016
comment
Я пробовал ту же процедуру в документации и работал отлично. Фактически конечная точка api для получения дисков - это https: // ‹teanantname› -my.sharepoint.com/_api/v2.0/me/drive. ресурс из токена доступа должен соответствовать конечной точке.   -  person npradeep357    schedule 29.07.2016
comment
Привет, Хуан, удалось ли тебе решить эту проблему? Служба обнаружения не вернет результатов, если я позвоню api.office.com/discovery/v2. 0 / я / услуги. Просто пусто. Но когда я жестко запрограммировал uri ресурса, я смог перечислить содержимое диска.   -  person Vlad    schedule 09.10.2016
comment
Можно ли заставить работать службу обнаружения? Спасибо за любую помощь   -  person Vlad    schedule 09.10.2016
comment
Служба обнаружения всегда возвращает мне следующий ответ: {@ odata.context: api.office.com/discovery/v1.0/me/}   -  person Vlad    schedule 09.10.2016


Ответы (1)


Возможно, будет немного поздно, но в этой статье в блоге рассказывается, как точно так же используйте OneDrive API и OneDrive для бизнеса 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();
person Tmm    schedule 20.01.2017