【发布时间】:2019-08-17 16:48:58
【问题描述】:
我试图得到与this online API service produces 相同的结果。
通过输入 key 作为应用程序密钥,并输入 secret 作为秘密,生成以下 URL:
http://webservices.esd.org.uk/organisations/barrowbc?ApplicationKey=key&Signature=YXWJsGSKnLcENW1vm30EYObbCsA=
我尝试使用以下代码生成相同的签名:
import hmac
import urllib
import base64
from hashlib import sha1
def sign_url(url,key,secret):
url = url + 'ApplicationKey=' + key
signature = hmac.new(secret,url,sha1).digest().encode("base64")
signature = '&Signature=' + signature
url = url + signature
print(url)
sign_url('http://webservices.esd.org.uk/organisations/barrowbc','key','secret')
但这会产生:
http://webservices.esd.org.uk/organisations/barrowbcApplicationKey=key&Signature=W//jgV+xdSbTBG6+i1TCGN/Kbsk=
预期的签名是
YXWJsGSKnLcENW1vm30EYObbCsA=
但我的代码输出
W//jgV+xdSbTBG6+i1TCGN/Kbsk=
【问题讨论】:
-
是否有任何关于签名必须基于哪些输入的文档?
-
有这个:api.esd.org.uk/pythoncode.txt,该网站在这里建议:api.esd.org.uk/security
-
坦率地说,他们的文档非常糟糕,而且 Python 代码几乎不完整。请注意,它们的 URL 以
?结尾,并且不考虑其他查询参数。它也不处理 URL 编码。我查看了他们的 PHP 代码并确认他们需要使用 URL 编码 decoded 对 URL 进行哈希处理。
标签: python python-2.7 sha1 hmac