我正在尝试为我尝试在Python中使用的API创建身份验证签名,我想要的是,
1)签名是使用URI的查询字符串部分的副本创建的,其示例如下所示。
?customerId = johns Trucks& userName = BobH& timeStamp = 2014-05-01T11:00:00Z
2)确保使用UTF8编码对私钥进行编码。编码后,您可以使用私钥
创建签名3)将步骤2中创建的签名转换为base64。
4)如果我们使用假钥的私钥,上面的URI字符串的签名在用HMAC-SHA1计算然后转换为base64之后将如下所示
PeKNVo1BAiuZyHxIdMisidG92bg =
5)现在可以将签名添加到请求的Http身份验证标头中。
以上内容摘自文档,以下是我的尝试,
private_key = bytes("auth", encoding='utf-8');
public_key = bytes("200000", encoding='utf-8');
customer_id = "HFH";
username = "API";
date_utc = datetime.datetime.now().strftime("%Y-%m-%dT%H:%M:%SZ")
message = bytes('?customerId=HFH&userName=API&timeStamp=' + date_utc, encoding='utf-8')
signature = base64.b64encode(hmac.new(private_key, message, digestmod=hashlib.sha1).digest())
encoded_sig = base64.b64encode(signature)
url = 'https://xxx.xxxxxxx.net/api/FleetVehicles?customerId=HFH&userName=API&timeStamp=' + date_utc;
data = requests.get(url, headers={'authorization:' + public_key + ":" + encoded_sig});
我的代码导致以下错误,
TypeError:无法转换'字节'隐含地反对str
错误来自我的代码示例的最后一行。
答案 0 :(得分:2)
我想你的代码是python 3。
从Python 3开始,字符串现在表示为 unicode 字符串或二进制数据,如所述here
Python 3.0使用文本和(二进制)数据的概念而不是 Unicode字符串和8位字符串。所有文本都是Unicode;然而 编码的Unicode表示为二进制数据。用来持有的类型 text是str,用于保存数据的类型是字节。最大的 与2.x情况的区别在于任何尝试混合文本和 Python 3.0中的数据引发TypeError,而如果你要混合 Python 2.x中的Unicode和8位字符串,如果是8位则可以工作 字符串碰巧只包含7位(ASCII)字节,但你会得到 UnicodeDecodeError,如果它包含非ASCII值。
你想要的是:
headers={b'authorization:' + public_key + b":" + encoded_sig})
(注意静态字符串之前的b
)
或:
headers={'authorization:' + public_key.decode('utf-8') + ":" + encoded_sig.decode('utf-8')})
(注意.decode()
将字节转换为 str )