为什么Python中API密钥的base64编码与外部软件对同一密钥的编码不同?

为什么Python中API密钥的base64编码与外部软件对同一密钥的编码不同?,python,base64,urllib2,urllib,Python,Base64,Urllib2,Urllib,我想对API密钥进行编码,以包含在HTTP请求的授权标头中。我已经使用该应用程序验证了授权标头应该是什么,并使用它成功地在Postman中发出请求,以及将URL和标头信息转换为urllib2请求时 但是,当我使用base64模块对API密钥进行编码时,生成的字符串与Postman的编码字符串略有不同,这导致在发出请求时授权失败。两个字符串之间的唯一区别是最后一个字符:正确编码的字符串(来自Postman)以“ZTk6”结尾,而Python编码的字符串以“ZTk=”结尾 据我所知,Python使用

我想对API密钥进行编码,以包含在HTTP请求的授权标头中。我已经使用该应用程序验证了授权标头应该是什么,并使用它成功地在Postman中发出请求,以及将URL和标头信息转换为urllib2请求时

但是,当我使用base64模块对API密钥进行编码时,生成的字符串与Postman的编码字符串略有不同,这导致在发出请求时授权失败。两个字符串之间的唯一区别是最后一个字符:正确编码的字符串(来自Postman)以“ZTk6”结尾,而Python编码的字符串以“ZTk=”结尾

据我所知,Python使用“=”填充base64编码字符串的结尾,但是,为什么这会导致不同的编码字符串?如何让Python输出正确授权API请求的编码密钥

我用来编码API字符串的Python代码是:

import base64
api_key_base64 = base64.b64encode(api_key_string)
# Have also tried
api_key_base64 = base64.b64encode(bytes(api_key_string))
# And
api_key_base64 = api_key_string.encode("base64")
未编码的API密钥字符串包含32个字母数字字符

由于我最终希望在授权标头中使用编码的密钥,如果有一种方法可以直接将API密钥字符串添加到urllib2请求中而无需编码,我很乐意使用该方法

系统:Windows7企业版

Python:2.7.13(ArcGIS桌面10.5.1安装)

虽然我目前使用的是Python2.7,但理想的解决方案也应该与3.x兼容

编辑:

我意识到编码应该在一个字符串上执行,该字符串包括两个由“:”分隔的授权组件,即使只使用一个组件(即API密钥)。 因此,标头的编码凭据应为:

import base64
username = "<username>"
password = "<password>"
user_cred_encoded = base64.b64encode("{}:{}".format(username, password))
api_key_string = "<api_key>"
api_key_encoded = base64.b64encode("{}:".format(api_key_string))
导入base64
username=“”
password=“”
user_cred_encoded=base64.b64encode(“{}:{}.”格式(用户名、密码))
api_key_string=“”
api_key_encoded=base64.b64encode(“{}:”.format(api_key_字符串))

这给了我预期的编码API密钥。

当我解码字符串的两个或您的base64结尾时,我得到:

>>> base64.decodebytes(b'ZTk6')
b'e9:'
>>> base64.decodebytes(b'ZTk=')
b'e9'
因此,我希望对于Python版本,您只需跳过最后一个
:'
(或
b'\x3a'
)字节。邮递员版本不是以2
':'
?

在这种情况下,这就足够了:

api_key_encoded = base64.b64encode("{}::".format(api_key_string))

=
填充是base64规范的一部分。对于32字节的输入,您应该看到43字节的base64和一个
=
填充字符,使其成为4个字符的偶数倍。如果您解码从Postman获得的值,它是否以换行结束?@tripleee否,解码后的Postman值等于API键字符串+”:“(冒号字符)听起来像是Postman中的错误,真的吗…?解码Postman值会给我原始的API密钥,其末尾只有一个冒号。