Я пытаюсь использовать OneDrive API, ADAL и Python request.post для загрузки файла в папку Sharepoint, но получаю ошибку 401.
Авторизация ADAL работает, так как получает правильный ответ токена и создает жизнеспособный access_token
.
Я могу использовать access_token
для загрузки файла из той же папки Sharepoint.
Хотя это работает только тогда, когда я вручную копирую print file_url
URL-адрес, созданный кодом, в браузер. Однако urllib.urlretrieve(file_url, local_file_name)
создает только файл с именем myfilename.csv
и содержимым 403 Forbidden
.
В моей авторизации используются жестко закодированные имя пользователя и пароль, и я сохраняю токен обновления в виде открытого текста и всегда извлекаю его при получении ответа токена:
import adal
import urllib
import requests
## set variables
username = '[email protected]'
password = 'mypassword'
authorization_url = 'https://login.windows.net/mydomain.onmicrosoft.com' # Authority
redirect_uri = 'https://login.microsoftonline.com/login.srf'
client_id = 'xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxx' # Client id
## use ADAL to create token response
token_response = adal.acquire_token_with_username_password(
authorization_url,
username,
password
)
## create refresh token and save it to use later
refresh_token = token_response['refreshToken']
refresh_token_file = open('refresh_token.txt', 'w')
refresh_token_file.write(refresh_token)
refresh_token_file.close()
## get saved refresh token and use it to get new token response
refresh_token = open('refresh_token.txt', 'r').read()
token_response = adal.acquire_token_with_refresh_token(authorization_url, str(refresh_token))
## get access_token from token response
access_token = token_response.get('accessToken')
Ответ токена правильный, и, используя токен доступа из него, следующий код создает URL-адрес file_url
, который я могу вручную скопировать и вставить в браузер, который успешно загружает файл. Однако urllib.urlretrieve(file_url, local_file_name)
создает только файл с именем myfilename.csv
и содержимым 403 Forbidden
:
## download file
file_url = 'https://mydomain.sharepoint.com/Shared%20Documents/myfoldername/myfilename.csv?token_response=' + str(access_token)
local_file_name = 'myfilename.csv'
urllib.urlretrieve(file_url, local_file_name)
Однако мне еще не удалось успешно загрузить в эту папку Sharepoint. В настоящее время у меня есть следующее:
# upload file
site_url = 'https://mydomain.sharepoint.com/'
headers = {'Authorization':'BEARER ' + str(access_token)}
r = requests.post(site_url, files={'Shared%20Documents/myfoldername/myfilename.csv': open('myfilename.csv', 'rb')}, headers=headers)
print r.text
который производит ответ
401 UNAUTHORIZED
У моего приложения Azure AD есть разрешения:
Read and write all user files
Read and write items and lists in all site collections
(not sure both are needed to upload files)
Мой request.post выглядит нормально? Почти уверен, что я правильно отправляю заголовок, папку и файл.
ИЗМЕНИТЬ, ЧТОБЫ ДОБАВИТЬ:
Учитывая тот факт, что код загрузки возвращает 403 Forbidden
, а код загрузки возвращает 401 Unauthorized
, я подозреваю, что проблема связана с тем, как urllib
и requests
отправляют URL-адреса.
ИЗМЕНИТЬ, ЧТОБЫ ДОБАВИТЬ:
Попытка создать URL-адрес файла для использования в GET и PUT. После аутентификации я могу вручную ввести этот URL-адрес в браузер:
https://mydomain.sharepoint.com/_api/v1.0/files/root
который возвращает следующий XML:
{"@odata.context":"https://mydomain.sharepoint.com/_api/v1.0/$metadata#files/$entity"
,"@odata.type":"#Microsoft.FileServices.Folder"
,"@odata.id":"https://mydomain.sharepoint.com/_api/v1.0/files/01QEW7725BZO3N6Y2GOV54373IPWSELRRZ"
,"@odata.editLink":"files/01QEW7725BZO3N6Y2GOV54373IPWSELRRZ"
,"createdBy":null
,"eTag":null
,"id":"01QEW7725BZO3N6Y2GOV54373IPWSELRRZ"
,"lastModifiedBy":null
,"name":"/"
,"parentReference":null
,"size":0
,"dateTimeCreated":"2013-07-31T02:35:57Z"
,"dateTimeLastModified":"2016-05-23T03:55:46Z"
,"type":"Folder"
,"webUrl":"https://mydomain.sharepoint.com/Shared%20Documents"
,"childCount":1}
Однако не нашел правильного синтаксиса для ссылки на файл. Например, это не работает:
https://mydomain.sharepoint.com/_api/v1.0/files/root:/myfoldername/myfilename.csv:/content
Это возвращает ошибку:
{"error":"invalid_client","error_description":"Invalid audience Uri 'https:\/\/m
anagement.core.windows.net\/'."}
Я думаю, что получение этой конкретной ссылки на файл - это то, что мне нужно, чтобы заставить его работать.
myfilename.csv
, но содержит только403 Forbidden
. Когда я печатаюfile_url
и копирую полученный URL-адрес напрямую в браузер, он загружает файл правильно. Я обновлю вопрос. - person curtisp   schedule 24.05.2016