我需要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)
还有其他尝试请求,但我不再有这些了。如果它有用,我可以得到这些错误,但是如果已经有一个已知的东西我做错了那会很棒......
答案 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编码时,它可以正常工作。当我编码其他字符时没有用,例如:和 @ 。