我一直在學習如何使用開源的Eucalyptus來使用Amazon S3 API。到目前爲止,我已經能夠成功使用REST,但現在我也想使用SOAP。我似乎無法爲我的請求生成正確的簽名。該服務是給我一個403 Forbidden錯誤:Eucalyptus Walrus/Amazon S3 SOAP簽名失敗
Traceback (most recent call last):
File "soap.py", line 31, in <module>
r = w.download_file('mybucket', 'test.txt')
File "soap.py", line 27, in download_file
r = self.client.service.ListAllMyBuckets(self.access_key, timestamp, signature)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 521, in __call__
return client.invoke(args, kwargs)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 581, in invoke
result = self.send(soapenv)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 619, in send
description=tostr(e), original_soapenv=original_soapenv)
File "/usr/lib/python2.6/site-packages/suds/client.py", line 677, in process_reply
raise Exception((status, description))
Exception: (403, u'Forbidden')
我的代碼是在Python 2和使用無泡沫Jurko庫發送SOAP請求:
from suds.client import Client
class WalrusSoap:
wsdl_url = 'https://s3.amazonaws.com/doc/2006-03-01/AmazonS3.wsdl'
server_url = 'https://localhost:8773/services/Walrus'
def __init__(self, access_key, secret_key):
self.access_key = access_key
self.secret_key = secret_key
self.client = Client(self.wsdl_url)
self.client.wsdl.services[0].setlocation(self.server_url)
#print self.client
def create_signature(self, operation, timestamp):
import base64, hmac, hashlib
h = hashlib.sha1(self.secret_key)
h.update("AmazonS3" + operation + timestamp)
#h = hmac.new(key=self.secret_key, msg="AmazonS3" + operation + timestamp, digestmod=hashlib.sha1)
return base64.encodestring(h.digest()).strip()
def download_file(self, bucket, filename):
from time import gmtime, strftime
timestamp = strftime('%Y-%m-%dT%H:%M:%S.001Z', gmtime())
print(timestamp)
signature = self.create_signature('ListAllMyBuckets', timestamp)
print(signature)
r = self.client.service.ListAllMyBuckets(self.access_key, timestamp, signature)
return r
w = WalrusSoap(access_key='MOBSE7FNS6OC5NYC75PG8', secret_key='yxYZmSLCg5Xw6rQVgoIuVLMAx3hZRlxDc0VOJqox')
r = w.download_file('mybucket', 'test.txt')
print(r)
我改變了服務器端點,否則WSDL指向亞馬遜的常規S3服務器。我也有兩種不同的方法在我的create_signature函數中創建簽名。我只是簡單地評論第二個,就是在彼此之間交換。兩者似乎都不起作用。我的問題是我做錯了什麼?
SOAP驗證:http://docs.aws.amazon.com/AmazonS3/latest/dev/SOAPAuthentication.html
SUDS-Jurko文檔:https://bitbucket.org/jurko/suds/overview
編輯:我發現我忘了,包括的打印什麼時間戳和簽名用於調試目的的例子。
2014-12-05T00:27:41.001Z
0h8vxE2+k10tetXZQJxXNnNUjjw=
編輯2:另外,我知道download_file功能無法下載文件:)我仍然在測試/調試階段
編輯3:我知道,REST是更好地使用,至少根據亞馬遜的說法。 (我個人認爲REST也更好。)我也已經意識到SOAP已被亞馬遜棄用。然而,無論如何,我想順着這條道路走下去,所以請幫我一個忙,不要浪費我的時間與鏈接到棄用。我向你保證,在編寫這個SOAP代碼時,我已經清楚了這個棄用。事實上,我發佈的其中一個鏈接已在其頁面頂部打印了棄用通知。但是,如果您有證據表明Walrus完全拋棄SOAP或他們停止了SOAP部分的工作,我希望看到類似的東西。但請不要告訴我亞馬遜已棄用SOAP。
我知道時間不能錯,因爲我正在運行的連接到Walrus的腳本是從託管Walrus的虛擬機運行的。您可能已經注意到server_url指向localhost。我確實試過'localtime()'而不是'gmtime()',只是爲了確定,並沒有用。不幸的是,在cloud-error.log中沒有任何幫助。感謝您檢查我的簽名。 – 2014-12-05 13:23:29
你也有證據證明Walrus不支持SOAP嗎? – 2014-12-05 13:40:03