Postman创建的base64值与Python不同';s用于unicode密码的base64模块-如何解释差异?

Postman创建的base64值与Python不同';s用于unicode密码的base64模块-如何解释差异?,python,postman,Python,Postman,我使用os.uradom(10)在python中创建了一个随机密码,该密码使用unicode值创建密码;例如: >>> import os >>> os.urandom(10) '\x8c[A\x91\xf0dq\xb2{\xcc' 在我公司的ldap工具中,我将用户的密码设置为该值 在Postman中,我可以通过复制和粘贴该值来创建基本授权标头,并成功验证 我尝试了requests.HTTPBasicAuth,但失败了,出现了UnicodeDecodeEr

我使用
os.uradom(10)
在python中创建了一个随机密码,该密码使用unicode值创建密码;例如:

>>> import os
>>> os.urandom(10)
'\x8c[A\x91\xf0dq\xb2{\xcc'
在我公司的ldap工具中,我将用户的密码设置为该值

在Postman中,我可以通过复制和粘贴该值来创建基本授权标头,并成功验证

我尝试了
requests.HTTPBasicAuth
,但失败了,出现了
UnicodeDecodeError
,从另一个问题中,我了解到HTTPBasicAuth并不是有意处理unicode值的。所以我试着用base64模块自己做:

import requests
import base64
...
encoded = base64.b64encode(username + ':' + password)
headers = {'Authorization': 'Basic ' + encoded}
r = requests.post(end_point, headers=headers, verify=False)
然而,这会导致Postman构建的base64编码值不同。由于授权,请求失败

此外,如果我将Postman创建的base64编码值复制并粘贴到代码中,则请求将正常工作,我将成功获得授权。这告诉我邮递员做得很成功


若要自己复制,请打开Postman并使用用户名“username”和密码“\x8c[a\x91\xf0dq\xb2{\xcc”创建基本身份验证。Postman生成以下64编码字符串:

dXNlcm5hbWU6XHg4Y1tBXHg5MVx4ZjBkcVx4YjJ7XHhjYw==
在python中,它执行以下操作:

>>> import base64
>>> username = 'username'
>>> password = '\x8c[A\x91\xf0dq\xb2{\xcc'
>>> base64.b64encode(username + ':' + password)
'dXNlcm5hbWU6jFtBkfBkcbJ7zA=='

这些差异的原因是什么?我如何让python生成与Postman相同的值(正如Postman生成正确的值一样?)

python字符串中的反斜杠是一个特殊字符,
\x
是一个十六进制转义序列,例如,
\x8c
是Œ的unicode字符。看起来需要显式转义反斜杠才能生成与邮递员相同的值:

>>> password = '\\x8c[A\\x91\\xf0dq\\xb2{\\xcc'
>>> base64.b64encode(username + ':' + password)
'dXNlcm5hbWU6XHg4Y1tBXHg5MVx4ZjBkcVx4YjJ7XHhjYw=='
或者将其设置为原始字符串:

>>> password = r'\x8c[A\x91\xf0dq\xb2{\xcc'
>>> base64.b64encode(username + ':' + password)
'dXNlcm5hbWU6XHg4Y1tBXHg5MVx4ZjBkcVx4YjJ7XHhjYw=='

python字符串中的反斜杠是一个特殊字符,
\x
是一个十六进制转义序列,例如,
\x8c
是Œ的unicode字符。看起来需要显式转义反斜杠才能生成与邮差相同的值:

>>> password = '\\x8c[A\\x91\\xf0dq\\xb2{\\xcc'
>>> base64.b64encode(username + ':' + password)
'dXNlcm5hbWU6XHg4Y1tBXHg5MVx4ZjBkcVx4YjJ7XHhjYw=='
或者将其设置为原始字符串:

>>> password = r'\x8c[A\x91\xf0dq\xb2{\xcc'
>>> base64.b64encode(username + ':' + password)
'dXNlcm5hbWU6XHg4Y1tBXHg5MVx4ZjBkcVx4YjJ7XHhjYw=='

字符串包含几个典型的转义序列。除非另有说明,否则Python将取消转义它们

若要定义字符串并忽略转义序列,请在其前面放置一个
r
。或者可以使用双反斜杠

text = r'\x00'
text = '\\x00'

这些都将导致
\x00
,而不是转义序列定义的ASCII码为0x00的字符。

字符串包含几个典型的转义序列。除非另有说明,否则Python将取消转义它们

若要定义字符串并忽略转义序列,请在其前面放置一个
r
。或者可以使用双反斜杠

text = r'\x00'
text = '\\x00'

这些都将导致
\x00
而不是转义序列定义的ASCII码0x00字符。

\x
不是Unicode字符。这将是
\u
\x
表示十六进制的原始字节,并以UTF-8编码显示在其他位置。感谢您的澄清,尽管我不是非常清楚您所说的“出现”语句是什么意思。
print(repr('\u008c'))->\x8c
\x
不是Unicode字符。这将是
\u
\x
表示十六进制的原始字节,并以UTF-8编码和其他位置显示。感谢您的澄清,尽管我不太清楚您所说的EXPENDS语句是什么意思。
print(repr('\u008c'))->\x8c