如何使用urllib2使用Python对站点进行身份验证?

时间:2012-03-03 18:33:08

标签: python authentication urllib2 basic-authentication

在Stackoverflow和网络上阅读了很多内容后,我仍然在努力让事情发挥作用。

我的挑战:使用Python和urllib2访问我所属的网站的受限制部分。

从我读过的代码应该是这样的:

mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()

url = 'http://www.domain.com'

mgr.add_password(None, url, 'username', 'password')
handler = urllib2.HTTPBasicAuthHandler(mgr)
opener = urllib2.build_opener(handler)

urllib2.install_opener(opener)

try:
    response = urllib2.urlopen('http://www.domain.com/restrictedpage')
    page = response.read()
    print page.geturl()
except IOError, e:
    print e

打印不会打印“http://www.domain.com/restrictedpage”,但会显示“http://www.domain.com/login”,因此我的凭据不会被存储/处理而且我'被重定向。

我怎样才能让它发挥作用?我已经尝试了好几天,并且一直在追求同样的死胡同。我已经尝试了所有我找不到的例子。

我的主要问题是:使用Python和urllib2对网站进行身份验证需要什么? 快速提问:我做错了什么?

2 个答案:

答案 0 :(得分:11)

首先手动检查成功通过身份验证后的实际情况(Chrome说明):

  • 在Chrome中打开开发工具(Ctrl + Shift + I)
  • 单击“网络”选项卡
  • 手动执行身份验证(转到页面,键入user + passwd + submit)
  • 检查开发人员工具的“网络”标签中的POST方法
  • 检查请求标头,查询字符串参数和表单数据。在那里,您可以在自己的POST中找到所需的所有信息。

然后安装"高级休息客户端(ARC)" Chrome扩展程序

使用ARC构建有效的POST进行身份验证。

现在您知道标题和表单数据中包含的内容。这是一个使用请求的示例代码,该代码适用于某个特定网站:

import requests

USERNAME = 'user' # put correct usename here
PASSWORD = 'password' # put correct password here

LOGINURL = 'https://login.example.com/'
DATAURL = 'https://data.example.com/secure_data.html'

session = requests.session()

req_headers = {
    'Content-Type': 'application/x-www-form-urlencoded'
}

formdata = {
    'UserName': USERNAME,
    'Password': PASSWORD,
    'LoginButton' : 'Login'
}

# Authenticate
r = session.post(LOGINURL, data=formdata, headers=req_headers, allow_redirects=False)
print r.headers
print r.status_code
print r.text

# Read data
r2 = session.get(DATAURL)
print "___________DATA____________"
print r2.headers
print r2.status_code
print r2.text

答案 1 :(得分:0)

对于HTTP Basic Auth,您可以参考:http://www.voidspace.org.uk/python/articles/authentication.shtml