我在我的Google应用程序引擎应用程序中使用Amazon web服务api。亚马逊表示,他们将只接受2009年8月15日以前的签名请求。虽然他们已经给出简单的instructions进行签名,但我并不熟悉SHA256的Python库。应用引擎文档says它支持pycrypto,但我只是想知道(读懒)如果任何人已经这样做。任何代码片段,你可以分享?我可能在这里错过的任何问题?如何从Python应用引擎签署亚马逊网络服务请求?
回答
根据代码示例得到这个工作http://jjinux.blogspot.com/2009/06/python-amazon-product-advertising-api.html 这是一个小的改进版本,可以让你在拨打电话之前合并一个特定于呼叫的参数字典和基本参数。
keyFile = open('accesskey.secret', 'r')
# I put my secret key file in .gitignore so that it doesn't show up publicly
AWS_SECRET_ACCESS_KEY = keyFile.read()
keyFile.close()
def amz_call(self, call_params):
AWS_ACCESS_KEY_ID = '<your-key>'
AWS_ASSOCIATE_TAG = '<your-tag>'
import time
import urllib
from boto.connection import AWSQueryConnection
aws_conn = AWSQueryConnection(
aws_access_key_id=AWS_ACCESS_KEY_ID,
aws_secret_access_key=Amz.AWS_SECRET_ACCESS_KEY, is_secure=False,
host='ecs.amazonaws.com')
aws_conn.SignatureVersion = '2'
base_params = dict(
Service='AWSECommerceService',
Version='2008-08-19',
SignatureVersion=aws_conn.SignatureVersion,
AWSAccessKeyId=AWS_ACCESS_KEY_ID,
AssociateTag=AWS_ASSOCIATE_TAG,
Timestamp=time.strftime("%Y-%m-%dT%H:%M:%S", time.gmtime()))
params = dict(base_params, **call_params)
verb = 'GET'
path = '/onca/xml'
qs, signature = aws_conn.get_signature(params, verb, path)
qs = path + '?' + qs + '&Signature=' + urllib.quote(signature)
print "verb:", verb, "qs:", qs
return aws_conn._mexe(verb, qs, None, headers={})
使用范例:
result = self.amz_call({'Operation' : 'ItemSearch' , 'Keywords' : searchString , 'SearchIndex' : 'Books' , 'ResponseGroup' : 'Small' })
if result.status == 200:
responseBodyText = result.read()
# do whatever ...
Pycrypto会正常工作 - 它在App Engine上支持,尽管公共密码是用Python而不是C实现的。您还应该能够使用现有的AWS库之一,现在支持urlfetch/httplib App Engine。
我有一个将图像上传到S3的应用程序,我已经实现了自己的请求签名,但主要是因为我在urlfetch/httplib可用之前编写了它。但它工作得很好。
感谢您的回复。我不明白使用现有AWS库进行请求签名的选项。有这样的图书馆吗?这不需要我发送我的密钥吗?当然,我在这里错过了一些东西。 – ottodidakt 2009-07-07 10:46:17
所有的AWS库都需要支持请求签名,因为它是我知道的访问AWS的唯一方法。您需要将密钥上传到App Engine,但不需要将其发送到AWS。 Python的boto库应该符合你的要求:http://code.google。com/p/boto/ – 2009-07-08 09:41:59
为GAE Python的签名服务的webapp见http://sowacs.appspot.com/AWS/Downloads/#python。使用本机Python库。
以下是基于较低级别(然后boto)库的REST请求示例。解决方案取自http://cloudcarpenters.com/blog/amazon_products_api_request_signing。
所有你需要的是AWS_ACCESS_KEY_ID有效条目,AWS_SECRET_ACCESS_KEY
def amazon_test_url():
import base64, hashlib, hmac, time
from urllib import urlencode, quote_plus
AWS_ACCESS_KEY_ID = 'YOUR_KEY'
AWS_SECRET_ACCESS_KEY = 'YOUR_SECRET_KEY'
TEST_ISBN = '9780735619678' #http://stackoverflow.com/questions/1711/what-is-the-single-most-influential-book-every-programmer-should-read
base_url = "http://ecs.amazonaws.com/onca/xml"
url_params = dict(
Service='AWSECommerceService',
Operation='ItemLookup',
IdType='ISBN',
ItemId=TEST_ISBN,
SearchIndex='Books',
AWSAccessKeyId=AWS_ACCESS_KEY_ID,
ResponseGroup='Images,ItemAttributes,EditorialReview,SalesRank')
#Can add Version='2009-01-06'. What is it BTW? API version?
# Add a ISO 8601 compliant timestamp (in GMT)
url_params['Timestamp'] = time.strftime("%Y-%m-%dT%H:%M:%SZ", time.gmtime())
# Sort the URL parameters by key
keys = url_params.keys()
keys.sort()
# Get the values in the same order of the sorted keys
values = map(url_params.get, keys)
# Reconstruct the URL parameters and encode them
url_string = urlencode(zip(keys,values))
#Construct the string to sign
string_to_sign = "GET\necs.amazonaws.com\n/onca/xml\n%s" % url_string
# Sign the request
signature = hmac.new(
key=AWS_SECRET_ACCESS_KEY,
msg=string_to_sign,
digestmod=hashlib.sha256).digest()
# Base64 encode the signature
signature = base64.encodestring(signature).strip()
# Make the signature URL safe
urlencoded_signature = quote_plus(signature)
url_string += "&Signature=%s" % urlencoded_signature
print "%s?%s\n\n%s\n\n%s" % (base_url, url_string, urlencoded_signature, signature)
我写的,只使用Python核心3库(不伯特),并使用AWS签名协议的版本2的另一个简单的例子:
http://xocoatl.blogspot.com/2011/03/signing-ec2-api-request-in-python.html
我知道它在GAE中不起作用,但对于只是寻找像我这样的AWS身份验证示例的人可能会很有用。
我用这一个使用pycrypto生成自定义策略:
import json
import time
from Crypto.Hash import SHA
from Crypto.PublicKey import RSA
from Crypto.Signature import PKCS1_v1_5
from base64 import b64encode
url = "http://*"
expires = int(time.time() + 3600)
pem = """-----BEGIN RSA PRIVATE KEY-----
...
-----END RSA PRIVATE KEY-----"""
key_pair_id = 'APK.....'
policy = {}
policy['Statement'] = [{}]
policy['Statement'][0]['Resource'] = url
policy['Statement'][0]['Condition'] = {}
policy['Statement'][0]['Condition']['DateLessThan'] = {}
policy['Statement'][0]['Condition']['DateLessThan']['AWS:EpochTime'] = expires
policy = json.dumps(policy)
private_key = RSA.importKey(pem)
policy_hash = SHA.new(policy)
signer = PKCS1_v1_5.new(private_key)
signature = b64encode(signer.sign(policy_hash))
print '?Policy=%s&Signature=%s&Key-Pair-Id=%s' % (b64encode(policy),
signature,
key_pair_id)
这让我使用了多个项目,像一个键:
http://your_domain/image1.png?Policy...
http://your_domain/image2.png?Policy...
http://your_domain/file1.json?Policy...
不要忘记启用pycrypto将此行添加到应用程序中.yaml
libraries:
- name: pycrypto
version: latest
- 1. 谷歌应用引擎或亚马逊网络服务
- 2. 亚马逊网络服务 - 签名
- 3. 亚马逊网络服务RDS数据库引擎版本
- 4. 亚马逊网络服务和非亚马逊网站
- 5. 使用亚马逊网络服务
- 6. 使用亚马逊网络服务作为谷歌应用引擎后端
- 7. 亚马逊网络服务错误请求
- 8. 在Swift中制作亚马逊网络服务S3 POST请求
- 9. 亚马逊网络服务 - API网关
- 10. 如何将战争部署到亚马逊网络服务
- 11. 如何将网络服务部署到亚马逊EC2?
- 12. 亚马逊ElasticSearch服务签名不匹配PUT请求 - 亚马逊SDK php V2
- 13. 亚马逊网络服务启动
- 14. 亚马逊网络服务503错误
- 15. 亚马逊网络服务S3和EC2
- 16. 亚马逊网络服务在非洲
- 17. S3亚马逊网络服务许可
- 18. 亚马逊Nodejs网络服务器
- 19. 亚马逊网络服务EMR定价
- 20. 亚马逊网络服务问题
- 21. 亚马逊网络服务+ iphone教程
- 22. 亚马逊网络服务安全吗?
- 23. 亚马逊网络服务MQTT
- 24. 亚马逊网络服务节流
- 25. Drupal与亚马逊网络服务?
- 26. 亚马逊网络服务SDK iOS
- 27. Xamarin Android亚马逊网络服务
- 28. 亚马逊网络服务性能
- 29. Swift和亚马逊网络服务
- 30. 亚马逊网络服务(AWS)架构
这对我不起作用 - 我得到“AttributeError:'AWSQueryConnection'对象没有属性'get_signature'” – scubbo 2014-09-30 18:59:58