如何获取 Amazon Api 的时间戳和签名

Posted

技术标签:

【中文标题】如何获取 Amazon Api 的时间戳和签名【英文标题】:How to get timestamp and Signature for Amazon Api 【发布时间】:2014-04-15 15:23:37 【问题描述】:

我正在阅读 Amazon Api 。但无法将 api 作为 url 读取并收到以下消息“无效的时间戳或签名”。如何获取这两个字段的值。

【问题讨论】:

发布一些代码和/或网址。 下面是我试图用来获取产品详细信息的网址。webservices.amazon.com/onca/xml? Service=AWSECommerceService& AWSAccessKeyId=[AWS Access Key ID]& Operation=ItemLookup& ItemId=B00008OE6I& IdType=ASIN& ResponseGroup=OfferFull& Condition=All& Timestamp=[YYYY-MM-DDThh:mm:ssZ] &Signature=[请求签名]。它要求时间戳和签名。 【参考方案1】:

尝试按照此处的说明和格式进行操作: http://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html

签名是特别困难的部分,因为它必须被计算和编码。 “使用上面的字符串和我们的“虚拟”秘密访问密钥:1234567890,使用 SHA256 哈希算法计算符合 RFC 2104 的 HMAC。有关此步骤的更多信息,请参阅您的编程语言的文档和代码示例。”

时间戳一般采用这种格式:UTC时间2009-01-01T12:00:00Z

我会试试这个 api 签名请求助手:http://aws.amazon.com/code/Product-Advertising-API/2609

【讨论】:

感谢请求助手,确实帮助我了解了身份验证过程。【参考方案2】:

这里我提供签名请求的代码。

$param = array();
$param['AWSAccessKeyId']   = USER_AWS_ACCESS_KEY_ID; 
$param['Action']           = 'GetFeedSubmissionList'; 
$param['SellerId']         = USER_MERCHANT_ID; 
$param['SignatureMethod']  = 'HmacSHA256'; 
$param['SignatureVersion'] = '2'; 
$param['Timestamp']        = gmdate("Y-m-d\TH:i:s.\\0\\0\\0\\Z", time()); 
$param['Version']          = '2009-01-01'; 
$param['MarketplaceId']    = USER_MARKETPLACE_ID;  

$url = array();
foreach ($param as $key => $val)

 $key = str_replace("%7E", "~", rawurlencode($key));
 $val = str_replace("%7E", "~", rawurlencode($val));

 $url[] = "$key=$val";


sort($url);

$arr   = implode('&', $url);

$sign  = 'GET' . "\n";
$sign .= str_replace("https://","",USER_AMAZON_URL) . "\n";
$sign .= '/' . "\n";
$sign .= $arr;

$signature = hash_hmac("sha256", $sign, USER_AWS_SECRET_ACCESS_KEY, true);
$signature = urlencode(base64_encode($signature));

$link  = USER_AMAZON_URL."?";
$link .= $arr . "&Signature=" . $signature;

$data = file_get_contents($link);

【讨论】:

谢谢,编码部分正是我在 php 中所需要的。【参考方案3】:

这可能有点晚了,但我只是让它与 java 一起工作:

public static String getSignature(String secret, String message) throws Exception 
    Mac sha256_HMAC = Mac.getInstance("HmacSHA256");
    SecretKeySpec secret_key = new SecretKeySpec(secret.getBytes(), "HmacSHA256");
    sha256_HMAC.init(secret_key);

    String hash = Base64.encodeBase64String(sha256_HMAC.doFinal(message.getBytes()));
    hash = URLEncoder.encode(hash, "UTF-8");

    return hash;

唯一需要的库是apache commons-codec

【讨论】:

以上是关于如何获取 Amazon Api 的时间戳和签名的主要内容,如果未能解决你的问题,请参考以下文章

SignatureDoesNotMatch - Amazon S3 API

如何通过 Amazon API Gateway (JAVA) 检索用户的公共 IP 地址

使用 Amazon API MWS 进行签名查询

如何根据 PHP 中给定的时间戳和 GMTOffset 值计算时间戳?

如何使用 amazon sdk 为虚域生成预签名的 Amazon S3 url?

Amazon S3 - 如何修复“我们计算的请求签名与签名不匹配”错误?