在 GAE 上,我hmac
用来为 AWS API 请求生成签名。我的代码原来是这样的:
import urllib
import urllib2
import time
import hmac
import base64
from hashlib import sha256 as sha256
class AmazonProductAdvertisingAPI:
secret_access_key = '...'
my_hmac = hmac.new(secret_access_key, digestmod=sha256)
def get_signed_url(self, params):
....
# Sign it
self.my_hmac.update('GET' + "\n" + server + "\n" + path + "\n" + paramstring)
urlstring = urlstring + "&Signature=" + \
urllib.quote(base64.encodestring(self.my_hmac.digest()).strip())
return urlstring
有了这个,我发现 API 请求(使用由 给出的 URL get_signed_url
)当且仅当请求是实例的“冷启动”时,例如在我部署代码并第一次运行它之后。
但是,随后的请求失败了,AWS 声称签名无效。这是通过移至my_hmac
方法内解决的,因此它是方法内的变量而不是类内的实例变量。
...
def get_signed_url(self, params):
my_hmac = hmac.new(self.secret_access_key, digestmod=sha256)
...
我有一个问题:为什么?