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