OneDrive API、ADAL、Python request.postを使用してSharepointフォルダにファイルをアップロードしようとしていますが、401エラーが発生しています。OneDrive APIファイルをアップロードするためのPython request.postで401エラーが発生する
正確なトークンレスポンスを取得し、実行可能なaccess_token
が生成されるため、ADAL認証が機能しています。
access_token
を使用して、同じSharepointフォルダからファイルをダウンロードできます。
これは、手動でコードによって作成されたprint file_url
のURLをブラウザにコピーする場合にのみ機能しますが、しかし、urllib.urlretrieve(file_url, local_file_name)
は、内容が403 Forbidden
のmyfilename.csv
という名前のファイルのみを作成します。
私の許可は、ハードコーディングされたユーザー名とパスワードを使用し、私はクリアテキストでリフレッシュトークンを保存し、トークンの応答を取得する際に、常にそれを取得しています:
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')
トークン応答が正しいとからアクセストークンを使用しています次のコードは、ファイルを正常にダウンロードするブラウザに手動でコピー&ペーストすることができるfile_url
URLを生成します。私はまだ正常にこのSharepointのフォルダにアップロードすることができませんでしたが
## 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)
:しかしurllib.urlretrieve(file_url, local_file_name)
は内容だけ403 Forbidden
とmyfilename.csv
という名前のファイルを作成します。現在、私は次のようしている:
# 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
マイアズール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は大丈夫見ていますか?私はヘッダー、フォルダ、ファイルを正しく送信していることを確かめてください。
EDIT追加する:
を考えると、実際に両方のダウンロードコードが403 Forbidden
を返し、アップロードのコードは、私は問題がどのようurllib
とrequests
URLを送信しているとの疑いがある401 Unauthorized
を返すこと。追加する
EDIT:
がGETやPUTで使用するファイルのURLを構築しようとしています。私が認証していた後、私は手動でブラウザにこの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\/'."}
私は、ファイルには、この特定の参照を取得すると、私はそれを動作させるためにするために必要なものだと思います。
は、あなたがあなたのファイルを正しくダウンロードしましたか?あなたのコードを試しましたが、ファイルをダウンロードする代わりに、私に別の場所にリダイレクトするhtmlファイルがあります。 –
あなたは正しくそれが正しくダウンロードされていません。 'myfilename.csv'という名前のファイルを作成しますが、内容は' 403禁止されています。 'file_url'を出力し、結果のURLをブラウザに直接コピーすると、ファイルが正しくダウンロードされます。私は質問を更新します。 – curtisp