我试图得到与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=
您的版本在
Application=
参数之前缺少必需的?
组件。但是,如果有其他参数,可能需要添加&
,并且需要删除.encode("base64")
添加到值末尾的新行:但是我注意到,当URL包含URL编码元素时,签名似乎应用于URL解码版本(将
+
解释为空格),因此在签名时确实需要添加urllib.unquote_plus()
(Python2)/urllib.parse.unquote_plus()
(Python3)调用:我已经确认了这就是他们的PHP example code所做的,并且验证了online signature tool中的示例查询参数,例如,当将路径和参数
foo%20bar?foo%20bar
输入工具时,CCuMYpCDznH4vIv95+NrN+RHEK0=
作为签名生成,但是使用foo+bar?foo+bar
生成完全相同的签名,即使+
should only be decoded as a space in form data。你知道吗我将解析出URL,将
ApplicationKey
参数添加到解析的参数中,然后构造一个新的URL进行签名。你知道吗这里有一个版本可以做到这一点,它同时适用于Python 2和Python 3:
相关问题 更多 >
编程相关推荐