我使用Moves API获取一些健身数据。我不想定期查询API,而是使用storyline notifications。
它有效,我从API收到请求,但我无法验证请求中提供的hmac sha1签名。
文档说:
所有通知请求都使用Base64编码的HMAC-SHA1进行签名 签名。签名计算为HMAC_SHA1(<您的客户端) secret>,< request body> |< timestamp> |< nonce>),换句话说客户端 密钥作为密钥和请求体,时间戳和nonce连接 作为消息数据。签名中不包含HTTP标头。 标题X-Moves-Signature,X-Moves-Timestamp和X-Moves-Nonce 包含签名,时间戳和随机数值。时间戳是 unix时间戳,自1970年1月1日00:00:00 GMT以来的秒数。
我的实施:
from hmac import new as hmac_new
from hashlib import sha1
def check_signature(signature, timestamp, nonce, client_secret, request_body):
msg = request_body + timestamp.encode('utf-8') + nonce.encode('utf-8')
hmac = hmac_new(key=client_secret, msg=msg, digestmod=sha1)
return hmac.digest().encode('base64') == signature
我从烧瓶那里得到了请求并且调用我的函数喜欢这个:
check_signature(headers['X-Moves-Signature'], headers['X-Moves-Timestamp'], headers['X-Moves-Nonce'], settings['client-secret'], request.data)
值:
client-secret= mnMuu6rDMkeG5FL0Fm0ho2z14JUhMVWAntUnGz0VyXc446RtqP8J7ETfag0TQa58
request-body = {"userId": 34511428141091768, "storylineUpdates": [{"reason": "DataUpload", "endTime": "20150429T121602Z", "lastSegmentType": "place", "lastSegmentStartTime": "20150429T101434Z", "startTime": "20150429T101434Z"}]}
X-Moves-Nonce = eqVCO4bnNbN+8Hhiz7ZceA==
X-Moves-Signature = BRMwYCxglul01wbyXpfpdtiJh2Y=
X-Moves-Timestamp = 1430309780
my-digest = paWR/3yiJ8NT8KukorGVJlpmQeM=
my-hexdigest = a5a591ff7ca227c353f0aba4a2b195265a6641e3
moves_signature = BRMwYCxglul01wbyXpfpdtiJh2Y=
我也尝试了http://www.freeformatter.com/hmac-generator.html并收到了a5a591ff7ca227c353f0aba4a2b195265a6641e3
。
(客户端密码不再有效)。
正如您从值中看到的,我的摘要和moves_signature不相等。可悲的是,我无法获得与移动中的摘要相同的摘要,但我无法找到问题所在。有没有人知道如何解决这个问题?