Base64编码问题Python vs Powersh

2024-10-01 07:46:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试对auth令牌进行编码并将其传递给restapi,这在powershell中可以正常工作,但是将相同的方法应用于python脚本会引发“unauthorized”异常。在

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

rest端点是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

^{pr2}$

Tags: 方法脚本authrestrestapi编码解决方案端点
1条回答
网友
1楼 · 发布于 2024-10-01 07:46:27

您发送的是文本字符串$password作为令牌,而不是名为password的变量的内容。在

您只需要在基本的Auth HTTP头中包含PasswordIsAuthToken和您的令牌(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代码也这样做,但是您省略了):

^{pr2}$

或者您可以使用json模块:

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

但是,我认为系统应该接受未包装的令牌。在

我强烈建议您改用^{} library,这使得使用REST API更加简洁:

import requests

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

请注意,不需要自己对JSON主体进行编码,也不必对基本Auth头进行编码。在

相关问题 更多 >