Ошибка 401 при загрузке с помощью Microsoft Graph

#office365 #daemon #onedrive #microsoft-graph-api

#office365 #демон #onedrive #microsoft-graph-api

Вопрос:

Я пытаюсь использовать приложение-демон для загрузки большого файла в учетную запись пользователя OneDrive для бизнеса. Мне удалось пройти аутентификацию и получить токен на предъявителя, создать папки и загрузить небольшие файлы.

Для больших файлов я создаю сеанс загрузки и получаю сообщение об ошибке при попытке добавить часть файла с помощью этого сеанса. Я включил свои трассировки скрипача, чтобы попытаться диагностировать это. Я удалил свою конфиденциальную информацию.

Я запрашиваю сеанс загрузки

 POST https://graph.microsoft.com/v1.0/users/{user id}/drive/items/{folder id}:/Test.csv:/createUploadSession HTTP/1.1
Authorization: Bearer {bearer token}
Content-Type: application/x-www-form-urlencoded
Host: graph.microsoft.com
Content-Length: 0
  

Я получаю ответ со следующим содержанием:

 "@odata.context":"https://graph.microsoft.com/v1.0/$metadata#microsoft.graph.uploadSession",
"expirationDateTime":"2016-10-05T11:39:29.5104044Z",
"nextExpectedRanges":["0-"],
"uploadUrl":"https://{my tenant name}.sharepoint.com/personal/name_domain_co_za/_api/v2.0/drive/root:/Backups/Test:/uploadSession?guid='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'amp;path='~tmp12_Test.csv'amp;overwrite=Trueamp;rename=False"}
  

Затем я пытаюсь указать этот URL-адрес загрузки

 PUT https://{my tenant name}.sharepoint.com/personal/name_domain_co_za/_api/v2.0/drive/root:/Backups/Test:/uploadSession?guid='aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa'amp;path='~tmp12_Test.csv'amp;overwrite=Trueamp;rename=False HTTP/1.1
Authorization: bearer {bearer token}
Content-Range: bytes 0-327679/16333102
Host: {my tenant name}.sharepoint.com
Content-Length: 327680
Expect: 100-continue
  

Затем ответ содержит следующие соответствующие строки.

 HTTP/1.1 401 Unauthorized
x-ms-diagnostics: 3000006;reason="Token contains invalid signature.";category="invalid_client"

{"error_description":"Invalid issuer or signature."}
  

Я нахожу это очень странным, потому что с текущей конфигурацией приложения я могу успешно загрузить небольшой файл по тому же пути, поэтому, если я чего-то не понимаю, с разрешениями не должно быть ничего плохого.

Комментарии:

1. На github есть поток с той же проблемой. Когда там будет разрешение, я добавлю его сюда.

Ответ №1:

Обновить:
Фактическая проблема заключалась в том, что запрос пытался использовать токен только для приложений для аутентификации в OneDrive для бизнеса через Graph. К сожалению, этот сценарий в настоящее время не поддерживается, и хотя некоторые сценарии могут работать, есть ряд, которые этого не делают (например, этот). Хотя мы не можем комментировать сроки, это определенно на нашем радаре!

Оригинал:
Есть несколько факторов, влияющих на загрузку фрагментов в учетную запись OneDrive для бизнеса через Graph.

  1. Маркеры аутентификации несовместимы. С другой стороны, токен-носитель, который вы используете для вызова createUploadSession graph, НЕ МОЖЕТ использоваться для PUT запросов, которые напрямую попадают в конечную точку OneDrive для бизнеса. Это связано прежде всего с тем, что токены привязаны к определенным аудиториям — токен для https://graph.microsoft.com/ не будет работать https://{my tenant name}.sharepoint.com/ .

  2. Из-за # 1 uploadUrl возвращаемое на самом деле не должно требовать авторизации в первую очередь — мы не хотим, чтобы разработчики манипулировали несколькими токенами аутентификации для разных конечных точек.

Похоже, что # 2 — это то, где в описанном вами представлении все не совсем так. Можете ли вы подтвердить, что uploadUrl получаемые значения НЕ содержат access_token параметров запроса или prooftoken НЕ содержат параметров запроса? Если это так, можете ли вы получить request-id заголовок из ответа на createUploadSession вызов?

Комментарии:

1. Если я не добавляю какой-либо токен на предъявителя в запрос PUT, я получаю запрет 403. В uploadUrl есть только параметры строки запроса «guid», «path», «перезаписать» и «переименовать». Идентификатор запроса для createUploadSession равен 1f7f8c78-ed0d-40ac-9fd0-e6f3c0631989

2. Извините, что я так перескакиваю, но у меня возникли проблемы с поиском этого запроса. У вас есть время, в которое был сделан запрос (желательно в UTC) — это поможет сопоставить.

3. Я ценю помощь. Теперь я сделал еще один запрос. Пт, 14 Окт 2016 20:47:45 GMT bdc93a86-84f8-4bed-9d7c-dbd3ce8ba98f

4. Я пропустил ту часть, где вы упомянули, что пишете приложение-демон — я предполагаю, что это означает, что вы используете токен только для приложений? Информация о запросе, похоже, подтверждает это. К сожалению, Graph пока не поддерживает такие токены для сценариев OneDrive :(. Я обновлю свой ответ.

5. Большое спасибо за вашу помощь в диагностике этого. Извините, я должен был уделять больше внимания этой части демона. Жаль, что он еще не поддерживается. Я буду продолжать пытаться в будущем.

Ответ №2:

Здесь та же проблема: загрузка небольших файлов выполняется правильно.

Чтобы загружать файлы большего размера, конечная точка бета-версии «https://graph.microsoft.com/beta » используется для достижения «Сеанса загрузки». Этот запрос выполнен успешно.

Но при использовании этого URI «Сеанса загрузки» команда HTTP PUT завершается с ошибкой :

x-ms-диагностика: 3000006; причина =»Токен содержит недопустимую подпись».;категория =»invalid_client»

Это код C # для отправки большого файла :

 using (var client = new HttpClient())
{
    byte[] sContents = File.ReadAllBytes(@"<MYLARGEFILE>");
    long length = sContents.Length;
    client.DefaultRequestHeaders.Add("Authorization", "Bearer "   accessTokenGraphMicrosoft);
    var content = new ByteArrayContent(sContents);
    content.Headers.Add("Content-Length", length.ToString());
    var response = client.PutAsync(<UPLOADSESSIONURI>, content).Resu<
}
  

Комментарии:

1. Спасибо за информацию. Что вы пытаетесь загрузить? Папка Onedrive / Onedrive для шины. / Sharepoint?

2. Привет, Дэрил. Я настроил Onedrive для бизнеса точно так же, как и вы, и получил URI Sharepoint. : o Я заметил, что реализация Office365 создала временный файл в этом каталоге.

Ответ №3:

У меня была такая же ошибка при загрузке файла после создания сеанса загрузки. После множества пробных ошибок я понял, что получаю это только тогда, когда имя документа содержит пробел.

Причина в том, что URL-адрес загрузки, возвращаемый в ответе createUploadSession, уже является URL-адресом в кодировке. Мой клиент REST дважды кодировал его, поскольку предполагал, что он не был закодирован. После двойного кодирования сеанс загрузки не удалось найти на сервере, и он вернул 401 с пустым телом.