2011-02-23 108 views
0

我在做什么:
我试图列出Devpay S3存储桶。试图列出Devpay S3存储桶 - 获取“SignatureDoesNotMatch”错误

引用我使用的是:
1. http://docs.amazonwebservices.com/AmazonS3/latest/API/RESTServiceGET.html
2. http://docs.amazonwebservices.com/AmazonDevPay/latest/DevPayDeveloperGuide/QuickReferenceS3Products.html
3. http://docs.amazonwebservices.com/AmazonDevPay/2007-12-01/DevPayDeveloperGuide/DesktopAWSCalls.html

我如何做:
使用PHP一个简单的REST的GET请求libcURL库:

GET/HTTP/1.1 
Host: s3.amazonaws.com 
Date: $date 
X-Amz-Date: $date 
X-Amz-Security-Token: $userToken, $productToken 
Authorization: $signatureValue 

哪里

$date // = timestamp at the time of request 

$signatureValue //= Authorization: AWS $signature 

$signature //= $userAccessKey:$signatureString 

$signatureString //=base64 encoded HMAC-SHA1 of $stringToSign with $userSecretKey 

$stringToSign //= utf8 encoded string: 

这个字符串 -

GET\n 
""\n 
""\n 
$date\n 
$canonicalized_AMZ_Headers\n 
/

我使用curl_exec()执行GET请求。

错误,那是我得到:

“SignatureDoesNotMatch”

“我们计算了不符合您所提供的签名检查你的密钥和签名方法请求签名。”

谢谢!
任何帮助将不胜感激

回答

1

从S3返回的错误消息将是一个StringToSign元素(使用查看源更清楚地看到它)。仔细比较这个字符串,你在一起签署请求—他们必须是正好相同。

+0

S3返回的字符串中没有'$ date' ...所以我删除它。比较我的'$ stringToSign'和亚马逊返回的StringToSign - 两者似乎都是一样的;不幸的是,错误也是如此: – 2011-02-24 18:39:19

+0

签名的S3 URLs应该包含过期时间,过期时间也需要设置为查询参数,请参见[认证页面](http://docs.amazonwebservices.com/AmazonS3/latest /dev/RESTAuthentication.html),我不是一个PHP的家伙(或者Devpay的人),但是AWS发布了一个[PHP SDK](http://aws.amazon.com/sdkforphp/ )HTH – 2011-02-25 04:56:49

+0

感谢乌利亚 - 我没有使用签名的URL,通过排除x-amz-date标题和包含常规的“Date:”,我能够解决这个问题。 ..“'标题,而且两个安全令牌需要分别列出,当不是在规范化的形式 ps的PHP SDK不幸的是不会与devpay S3的桶:( - 感谢您的所有输入 – 2011-02-26 02:26:13

相关问题