SharePoint Online中的远程身份验证

时间:2016-02-03 21:07:57

标签: python python-2.7 sharepoint urllib2 office365

我正在尝试编写一个带有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?

1 个答案:

答案 0 :(得分:10)

根据Remote Authentication in SharePoint Online Using Claims-Based AuthenticationSharePoint 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(FedAuthrtFa),如您提到的文章中所述。

适用于Python的SharePoint Online REST客户端

作为概念验证,SharePoint Online REST client for Python已经发布,其中显示了如何:

  • 在SharePoint Online中执行远程身份验证
  • 针对SharePoint资源执行基本CRUD操作,例如 使用REST API的Web,列表或列表项

实施细节

<强>实施例

该示例显示了如何读取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文件夹下找到更多示例