我正在尝试编写一个带有SharePoint包的脚本来访问我公司的SharePoint上的文件。教程陈述
首先,您需要创建一个
SharePointSite
对象。我们假设您正在使用基本身份验证;如果你不是,你需要自己创建一个合适的urllib2
开启者。
然而,经过多次尝试,我得出的结论是基本认证是不够的。在研究如何使其工作的同时,我遇到了this article,它对一般的身份验证方案进行了很好的概述。我正在努力解决的是在Python中实现这一点。
我设法劫持了SharePoint模块中的基本身份验证。为此,我在链接的文章中使用了XML消息,并使用它来替换SharePoint模块生成的XML。在进行了一些其他更改之后,我现在收到了链接文章的第2步中描述的令牌。
现在,在第3步中,我需要使用POST将该令牌发送到SharePoint。以下是它应该是什么样子的样本:
POST http://yourdomain.sharepoint.com/_forms/default.aspx?wa=wsignin1.0 HTTP/1.1
Host: yourdomain.sharepoint.com
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Content-Length: [calculate]
t=EwBgAk6hB....abbreviated
我目前使用以下代码生成POST。在其他一些问题的指导下,我省略了content-length
标题,因为应该自动计算。我不确定将令牌放在哪里,所以我只是把它推到了data
。
headers = {
'Host': 'mydomain.sharepoint.com',
'Connection': 'keep-alive',
'User-Agent': 'Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)'
}
data = {'t':'{}'.format(token[2:])}
data = urlencode(data)
postURL = "https://mydomain.sharepoint.com/_forms/default.aspx?wa=wsignin1.0"
req = Request(postURL, data, headers)
response = urlopen(req)
但是,这会产生以下错误消息:
urllib2.HTTPError: HTTP Error 302: The HTTP server returned a redirect error that would lead to an infinite loop.
The last 30x error message was:
Found
如何生成能够正确返回我需要的身份验证Cookie的POST?
答案 0 :(得分:10)
根据Remote Authentication in SharePoint Online Using Claims-Based Authentication和SharePoint Online authentication文章:
联邦身份验证(FedAuth)cookie适用于每个顶级 SharePoint Online中的站点,例如根站点,MySite,Admin 网站和公共网站。根联合身份验证(rtFA) cookie用于所有SharePoint Online。当用户访问时 新的顶级网站或其他公司的网页,使用rtFA cookie 在没有提示的情况下以静默方式验证它们。
总而言之,要获取身份验证cookie,需要将请求发送到以下端点:
url: https://tenant.sharepoint.com/_forms/default.aspx?wa=wsignin1.0
method: POST
data: security token
验证请求后,响应将在HTTP标头中包含身份验证Cookie(FedAuth
和rtFa
),如您提到的文章中所述。
作为概念验证,SharePoint Online REST client for Python已经发布,其中显示了如何:
实施细节:
AuthenticationContext.py
class包含 SharePoint
在线远程认证流程实施,特别是
acquireAuthenticationCookie
函数演示了如何处理
身份验证cookie ClientRequest.py
class显示了如何使用SharePoint Online REST API <强>实施例强>
该示例显示了如何读取Web客户端对象属性:
from client.AuthenticationContext import AuthenticationContext
from client.ClientRequest import ClientRequest
url = "https://contoso.sharepoint.com/"
username = "jdoe@contoso.onmicrosoft.com"
password = "password"
ctxAuth = AuthenticationContext(url)
if ctxAuth.acquireTokenForUser(username, password):
request = ClientRequest(url,ctxAuth)
requestUrl = "/_api/web/" #Web resource endpoint
data = request.executeQuery(requestUrl=requestUrl)
webTitle = data['d']['Title']
print "Web title: {0}".format(webTitle)
else:
print ctxAuth.getLastErrorMessage()
可以在GitHub存储库的examples文件夹下找到更多示例