Saya mencoba menggunakan OneDrive API, ADAL dan Python request.post untuk mengunggah file ke folder Sharepoint tetapi saya mendapatkan kesalahan 401.
Otorisasi ADAL berfungsi untuk mendapatkan respons token yang benar dan menghasilkan access_token
yang layak.
Saya dapat menggunakan access_token
untuk mengunduh file dari folder Sharepoint yang sama.
Meskipun ini hanya berfungsi ketika saya secara manual menyalin print file_url
url yang dibuat oleh kode ke browser. Namun urllib.urlretrieve(file_url, local_file_name)
hanya membuat file bernama myfilename.csv
dengan konten 403 Forbidden
.
Otorisasi saya menggunakan nama pengguna dan kata sandi yang dikodekan, dan saya menyimpan token penyegaran dalam teks yang jelas, dan selalu mengambilnya ketika mengambil respons token:
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')
Respons token sudah benar dan menggunakan token akses darinya, kode berikut menghasilkan url file_url
yang dapat saya salin dan tempel secara manual ke browser yang berhasil mengunduh file. Namun urllib.urlretrieve(file_url, local_file_name)
hanya membuat file bernama myfilename.csv
dengan konten 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)
Namun saya belum berhasil mengunggah ke folder Sharepoint ini. Saat ini saya memiliki yang berikut ini:
# 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
yang menghasilkan respons
401 UNAUTHORIZED
Aplikasi Azure Active Directory saya memiliki izin:
Read and write all user files
Read and write items and lists in all site collections
(not sure both are needed to upload files)
Apakah request.post saya terlihat baik-baik saja? Cukup yakin saya mengirimkan header, folder dan file dengan benar.
EDIT UNTUK MENAMBAHKAN:
Mengingat fakta bahwa kode unduhan mengembalikan 403 Forbidden
dan kode unggahan mengembalikan 401 Unauthorized
Saya curiga masalahnya ada pada cara urllib
dan requests
mengirim url.
EDIT UNTUK MENAMBAHKAN:
Mencoba membuat url file untuk digunakan di GET dan PUT. Setelah saya diautentikasi, saya dapat memasukkan url ini secara manual ke browser:
https://mydomain.sharepoint.com/_api/v1.0/files/root
yang mengembalikan XML berikut:
{"@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}
Namun belum menemukan sintaks yang benar untuk referensi ke file tersebut. Misalnya ini tidak berfungsi:
https://mydomain.sharepoint.com/_api/v1.0/files/root:/myfoldername/myfilename.csv:/content
Ini mengembalikan kesalahan:
{"error":"invalid_client","error_description":"Invalid audience Uri 'https:\/\/m
anagement.core.windows.net\/'."}
Saya pikir mendapatkan referensi khusus ke file ini adalah hal yang saya perlukan agar dapat berfungsi.
myfilename.csv
tetapi isinya hanya403 Forbidden
. Ketika saya mencetakfile_url
dan menyalin url yang dihasilkan ke browser secara langsung, file tersebut diunduh dengan benar. Saya akan memperbarui pertanyaan. - person curtisp   schedule 24.05.2016