Base64编码问题 - Python与Powershell

时间:2017-05-01 18:03:15

标签: python rest powershell urllib2

我正在尝试对auth令牌进行编码并将其传递给REST API,这对powershell工作正常,但对python脚本应用相同的方法会引发“未经授权的”异常。

我怀疑编码值存在问题。无法找出解决方案。有什么想法吗?

其余端点是IBM uDeploy。

Powershell的

$tokenEncoded = [System.Convert]::ToBase64String([System.Text.Encoding]::UTF8.GetBytes( "PasswordIsAuthToken:{`"token`":`"$pass`"}" ))
$basicAuthValue = "Basic $tokenEncoded"
$headers = @{}
$headers.Add("Authorization", $basicAuthValue)
$response = Invoke-RestMethod -Method Put -Headers $headers -Uri $requestUri -Body $jsonRequest

的Python

epass = base64.b64encode("PasswordIsAuthToken:{\"token\":\"$password\"}")
print 'base64 encoded: ' + epass
opener = urllib2.build_opener(urllib2.HTTPHandler)
req = urllib2.Request(reqUrl,json.dumps(json_data))
req.add_header('Authorization', 'Basic '+epass)
req.get_method = lambda: 'PUT'
resp = opener.open(req)

1 个答案:

答案 0 :(得分:2)

您发送文字字符串$password作为标记,而不是名为password的变量的内容。

您只需要将PasswordIsAuthToken和您的令牌包含在基本身份验证HTTP标头中(PasswordIsAuthToken形成用户名,并token密码):

epass = base64.b64encode("PasswordIsAuthToken:" + password)
opener = urllib2.build_opener(urllib2.HTTPHandler)
req = urllib2.Request(reqUrl,json.dumps(json_data))
req.add_header('Authorization', 'Basic ' + epass)

如果您需要将令牌包装在类似JSON的结构中,那么您需要使用字符串格式(Powershell代码也会这样做,但是您省略了):

epass = base64.b64encode('PasswordIsAuthToken:{"token":"%s"}' % password)

或者您可以使用json模块:

epass = base64.b64encode('PasswordIsAuthToken:' + json.dumps({'token': password}))

但是,我相信系统应该接受解包的令牌。

我强烈建议您改用requests library,这样可以更加清晰地使用REST API:

import requests

auth = ('PasswordIsAuthToken', password)
# or alternatively
# auth = ('PasswordIsAuthToken', '{"token":"%s"}' % password)
response = requests.put(json=json_data, auth=auth)

请注意,不需要自己编码JSON主体,也不必编码Basic Auth标头。