OneDrive API - 参考要上传或下载的 Sharepoint 文件 - 受众无效错误

OneDrive API - Refer to Sharepoint file to upload or download - invalid audience error

我想以编程方式与 Office 365 E3 Sharepoint 站点中的文件进行交互。

我正在使用 Azure AD 和 ADAL Python library 来验证对 Sharepoint 站点文件的访问。

import adal
import urllib
import requests
import urllib2

## set variables
username = 'curtis@tenant.onmicrosoft.com'
password = 'OFoarry8Oe$'
authorization_url = 'https://login.windows.net/tenant.onmicrosoft.com' # Authority
redirect_uri = 'https://login.microsoftonline.com/login.srf'
client_id = 'dcbf844f-d2c3-42d1-8a7d-0f838f57899a' # Client id

## use ADAL to create token response
token_response = adal.acquire_token_with_username_password(
        authorization_url,
        username,
        password
    )
## endpoints discovery
## https://api.office.com/discovery/v2.0/me/allServices

## 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')
headers = {'Authorization':'BEARER ' + str(access_token)}

如我所愿认证成功

print access_token

其中 returns 一个标记字符串。

我正在努力研究用于从 Sharepoint 文件夹下载和上传文件的语法。这是我目前所拥有的:

## download file
file_url = 'https://tenant.sharepoint.com/_api/v1.0/files/root:/myfoldername/myfilename.csv:/content'
r = requests.get(file_url, headers=headers)
print r.text

到目前为止我还没有能够成功引用该文件。我收到一个错误:

{"error":"invalid_client","error_description":"Invalid audience Uri 'https:\/\/management.core.windows.net\/'."}

这似乎表明我指的是 wrong Site. or perhaps referring to

这是我从 Sharepoint 站点获得的我要下载的文件(从其在 Sharepoint 中的属性)获得的 url:

https://tenant.sharepoint.com/Shared%20Documents/myfoldername/myfilename.csv

来自 Sharepoint 站点的文件的 url 是否有助于定义 file_url 语法应该是什么?如果不是,我还能如何确定 file_url 应该是什么?

根据代码,您已使用 Azure AD 进行身份验证,但调用 SharePoint REST API。 SharePoint REST 是不同的身份验证流程。您可以从 here.

中引用它

在您的方案中,我们可以使用 Microsoft Graph API 从 Office 365 中的 SharePoint 站点下载内容。以下是在您的默认站点上下载文件内容的示例:

GET: https://graph.microsoft.com/v1.0/me/drive/root:/test.txt:/content

authorization: bearer {token}

有关 Microsoft Graph API 的更多详细信息,请参阅以下链接:

https://graph.microsoft.io/en-us/docs/api-reference/v1.0/api/item_downloadcontent

https://graph.microsoft.io/en-us/docs/authorization/app_authorization

飞雪让我走上了正确的道路。我的代码正在请求 ADAL 未预期的资源。

原来 __init__.py 中的 adal.acquire_token_with_username_passworddefault values(参见 class _DefaultValues 中代码的底部)client_idresource

ADAL 的默认资源是 https://management.core.windows.net/,这是它期望我的 file_url 资源具有的资源。 invalid audiencehttps://tenant.sharepoint.com

所以我更改了 ADAL 的默认值:

`client_id` = my Azure AD app's client_id 
`resource` = `https://tenant.sharepoint.com/`  

ADAL 的 acquire_token_with_username_password(见下文)将 client_idresource 设置为 None。我没有尝试,但猜测这些可以被编辑以删除 =None 并在我的代码中设置而不是 class _DefaultValues.

def acquire_token_with_username_password(
    authority,
    username,
    password,
    client_id=None,
    resource=None,
    validate_authority=True
):

并且还对我的 file_url(url 文件名)进行了较小的(但需要)更改为:

file_url = 'https://pokrant.sharepoint.com/_api/v2.0/drive/root:/analytics/output_analytics.csv:/content'

现在,当我 运行 编码时,我会在控制台中打印出 csv 文件内容。