亚马逊产品查找签名不匹配

问题描述 投票:0回答:1

这是我得到的响应:我们计算的请求签名与您提供的签名不匹配。

这是我用来生成签名的代码:

static byte[] HmacSHA256(String data, byte[] key)
{
    String algorithm = "HmacSHA256";
    KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm);
    kha.Key = key;

    return kha.ComputeHash(Encoding.UTF8.GetBytes(data));
}

static byte[] getSignatureKey(String key, String dateStamp, String regionName, String serviceName)
{
    byte[] kSecret = Encoding.UTF8.GetBytes(("AWS4" + key).ToCharArray());
    byte[] kDate = HmacSHA256(dateStamp, kSecret);
    byte[] kRegion = HmacSHA256(regionName, kDate);
    byte[] kService = HmacSHA256(serviceName, kRegion);
    byte[] kSigning = HmacSHA256("aws4_request", kService);

    return kSigning;
}

当我使用亚马逊的测试设置时,我得到了正确的签名

key = 'wJalrXUtnFEMI/K7MDENG+bPxRfiCYEXAMPLEKEY'
dateStamp = '20120215'
regionName = 'us-east-1'
serviceName = 'iam'

但是,当我输入实时设置时,我收到不匹配的错误。

这是我用来获取签名的:

var reqSig = getSignatureKey("[my secret key]", dateStamp, "us-west-2","AWSECommerceService");

这就是我要提交的内容(目前我只是在浏览器中测试它):

ecs.amazonaws.com/onca/xml?Service=AWSECommerceService&AWSAccessKeyId=[my
access key that corresponds with the secret
key]&Operation=ItemLookup&IdType=UPC&ItemId=635753490879&Timestamp=2019-01-24T19:14:55.2644840Z&Signature=32BA07ECE67F3177BF2EA02923E624D612A45FAA144ED0E43BDDC0DF6574EAC3

我不确定这是否与区域有关(在我的例子中是 us-west-2),因为请求中没有区域。如果我无法指定它所在的区域并且我已使用该区域来计算签名,我不确定亚马逊如何根据我的参数测试我的签名。

我错过了什么?

request signature amazon-product-api
1个回答
0
投票

好的。花了几天时间经历这个之后,这就是我必须做的:

/*

    DOCUMENTATION: https://docs.aws.amazon.com/AWSECommerceService/latest/DG/rest-signature.html#rest_detailedexample
*/

    var itemID = "0679722769";
    var accessKeyID = "AKIAIOSFODNN7EXAMPLE";
    var timeStamp = DateTime.UtcNow.ToString("o");
    var req = $"Service=AWSECommerceService&AWSAccessKeyId={accessKeyID}&Operation=ItemLookup&IdType=UPC&ItemId={itemID}&Version=2013-08-01&Timestamp={timeStamp}";
    req = req.Replace(":", "%3A").Replace(",", "%2C"); //UrlDecode certain characters
    var reqlist = req.Split('&').ToArray(); //we need to sort our key/value pairs
    Array.Sort(reqlist);
    req = String.Join("&", reqlist); //join everything back
    var reqToSign = $@"GET
webservices.amazon.com
/onca/xml
{req}".Replace("\r", ""); //create the request for signing. We need to replace microsofts's crlf with just a lf; Make sure there are no leading spaces after the linefeeds.

    var signage = getSignatureKey("1234567890",reqToSign);
    req = $"http://webservices.amazon.com/onca/xml?{req}&Signature={signage}"; //create our request with the signature appended.
    return req;
}

private static byte[] HmacSHA256(String data, byte[] key)
{
    String algorithm = "HmacSHA256";
    KeyedHashAlgorithm kha = KeyedHashAlgorithm.Create(algorithm);
    kha.Key = key;

    return kha.ComputeHash(Encoding.UTF8.GetBytes(data));
}


private static string getSignatureKey(string key, string stringToSign)
{
    byte[] kSecret = Encoding.UTF8.GetBytes(key.ToCharArray());
    byte[] kSigning = HmacSHA256(stringToSign, kSecret);
    return WebUtility.UrlEncode(Convert.ToBase64String(kSigning));
}

与此处和其他地方找到的大多数答案相反,这是唯一有效的方法。必须对整个请求进行哈希处理,而不仅仅是特定参数。我无法与其他亚马逊服务交谈,但商务服务必须这样做。

相当多的答案引用了这个:https://docs.aws.amazon.com/general/latest/gr/sigv4-calculate-signature.html或这个:Amazon API在C#.NET中生成请求签名

正如我在问题中所说,这肯定是不正确的。如果您不传递区域参数,亚马逊如何创建相同的签名,因为它没有所有信息。

无论如何,现在可以了。

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.