URL中的HTTP身份验证,用户名中带反斜杠

时间:2014-03-21 16:52:00

标签: python curl request urllib2 urllib

我需要HTTP Basic Auth进行REST调用。在用户名中,我必须提供一个域(带有连字符),然后使用反斜杠将其与用户名分开,如下所示: DOM-AIN \ user_name 。然后密码非常温和。

这适用于卷曲:

curl 'https://DOM-AIN\user_name:password@myurl.com'

我现在需要把它放到Python中,但我尝试过使用request和urllib / 2/3 ......他们不喜欢 \ @ 。即使我将URL编码为%40等,这些也会被解释为实际的,并且urllib认为我正在尝试定义端口而且我收到错误:无效的套接字,我想,我忘记。

所以我尝试使用urllib3在标题中传递用户名和密码,但我收到了未经授权的访问错误,我怀疑是因为我需要以某种方式编码标题中的用户名来计算反斜杠(%5C),但是这似乎也不起作用。

以下是一些不起作用的代码:

# Attempt 1
http = urllib3.PoolManager()
url1 = https://ws.....
headers = urllib3.util.make_headers(basic_auth='DOM-AIN\user_name:password')
r1 = http.request('GET', url1, headers=headers)
response = r1.data

# Attempt 2
passwordManager = urllib2.HTTPPasswordMgrWithDefaultRealm()
passwordManager.add_password(None, url, 'DOM-AIN\user_name, password)
authenticationHandler = urllib2.HTTPBasicAuthHandler(passwordManager)
opener = urllib2.build_opener(authenticationHandler)
data = opener.open(url1)

还有其他尝试请求,但我不再有这些了。如果它有用,我可以得到这些错误,但是如果已经有一个已知的东西我做错了那会很棒......

3 个答案:

答案 0 :(得分:2)

反斜杠应该在Python字符串文字中转义:

username = 'DOM-AIN\\user_name' # OR
username = r'DOM-AIN\user_name' # raw-string literal

示例:

import urllib2, base64

request = urllib2.Request('https://example.com')
credentials = base64.b64encode(username + b':' + password)
request.add_header('Authorization', b'Basic ' + credentials)
response = urllib2.urlopen(request) 

注意:与HTTPBasicAuthHandler代码不同;它总是在不等待401标题的WWW-Authenticate响应的情况下发送凭据。

答案 1 :(得分:0)

首先将您的DOM-AIN\user_name转换为base64字符串。让我们说XXXXYYYYYYY。现在将此base64字符串放入http标头中,如下面的urllib2代码。

headers = { 'Authorization:' : 'Basic XXXXYYYYYYY' }
req = urllib2.Request(url, data, headers)

答案 2 :(得分:0)

我找到了一种使用urllib的方法,this post's提到FancyURLopener让我走上了正确的道路。这是我最接近复制卷曲方式的方法,虽然看看Sabuj的答案,可能有一种方法可以正确使用标题,但我还没有尝试过他的方法。

import urllib
opener = urllib.FancyURLopener()
data = opener.open('https://DOM-AIN**%5C%user_name:password@url.com?whatever_parameters')
response = data.read()

当我仅对反斜杠进行URL编码时,它可以正常工作。当我编码其他字符时没有用,例如 @