本文介绍了如何使用HMACSHA256 python3验证Xero WebHook有效负载的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
根据此处的说明(https://developer.xero.com/documentation/webhooks/configuring-your-server)设置和验证Xero网络挂钩的接收意图。
计算的签名应与正确签名的负载的标头中的签名匹配。
但是,使用python3,计算出的签名与头中的签名完全不匹配。Xero会向订阅的WebHook URL发送大量正确和不正确的请求。在我的日志中,所有这些请求都返回为401。因此,下面是我的测试代码,也被证明不匹配。我不知道丢失了什么,也不知道我做错了什么。不要担心这里显示的密钥,我已经生成了另一个密钥,但这是分配给我用于散列的密钥。根据他们的说明,运行此代码应该使签名与其中一个头匹配。但一点也不接近。
XERO_KEY =
"lyXWmXrha5MqWWzMzuX8q7aREr/sCWyhN8qVgrW09OzaqJvzd1PYsDAmm7Au+oeR5AhlpHYalba81hrSTBeKAw=="
def create_sha256_signature(key, message):
message = bytes(message, 'utf-8')
return base64.b64encode(hmac.new(key.encode(), message,
digestmod=hashlib.sha256).digest()).decode()
# first request header (possibly the incorrect one)
header = "onoTrUNvGHG6dnaBv+JBJxFod/Vp0m0Dd/B6atdoKpM="
# second request header (possibly the correct one)
header = "onoTrUNvGHG6dnaBv+JBJxFodKVp0m0Dd/B6atdoKpM="
payload = {
'events':[],
'firstEventSequence':0,
'lastEventSequence':0,
'entropy':
'YSXCMKAQBJOEMGUZEPFZ'
}
payload = json.dumps(payload, separators=(",", ":")).strip()
signature = create_sha256_signature(XERO_KEY, str(payload))
if hmac.compare_digest(header, signature):
print(True)
return 200
else:
print(False)
return 401
推荐答案
问题是因为当我接收请求负载时,我正在使用
# flask request
request.get_json()
这将自动将我的请求数据解析为JSON格式,这就是计算出的签名始终不匹配的原因
因此,我所做的就是更改了我接收请求负载的方式:
request.get_data()
这将获得原始数据。
这篇关于如何使用HMACSHA256 python3验证Xero WebHook有效负载的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!