无法使用Golang生成Amazon产品API签名

时间:2016-01-09 08:32:54

标签: amazon-web-services go

帮助。我无法使用Amazon和Go提供的测试参数获得正确的签名。

我的签名哈希函数如下。我根据亚马逊文档使用SHA-256和base64编码。

func HashSignature(str string, secret string) string {
  mac := hmac.New(sha256.New, []byte(secret))
  _, err := mac.Write([]byte(str))
  if err != nil {   return "" }

  hash := base64.StdEncoding.EncodeToString(mac.Sum(nil))
  hash = url.QueryEscape(hash)
  return hash
}

我的签名测试功能如下。我在Ruby代码中使用下面的规范字符串,它会生成正确的预期签名。所以问题似乎与我的HashSignature()函数的输出有关,但我不知道我在那里做错了什么。

func TestAmazonSignature(t *testing.T) {
/* here is the canonical string from Amazon documentation which should yield the expected signature below
GET
webservices.amazon.com
/onca/xml
AWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01
*/
  SECRET_KEY := "1234567890"
  CANONICAL_STR := "GET\nwebservices.amazon.com\n/onca/xml\nAWSAccessKeyId=AKIAIOSFODNN7EXAMPLE&AssociateTag=mytag-20&ItemId=0679722769&Operation=ItemLookup&ResponseGroup=Images%2CItemAttributes%2COffers%2CReviews&Service=AWSECommerceService&Timestamp=2014-08-18T12%3A00%3A00Z&Version=2013-08-01"

  EXPECTED := "j7bZM0LXZ9eXeZruTqWm2DIvDYVUU3wxPPpp%2BiXxzQc%3D"

  if RESULT := HashSignature(CANONICAL_STR, SECRET_KEY); RESULT != EXPECTED {
    t.Errorf("\nEXPECTED:\n%v\nRESULT:\n%v", EXPECTED, RESULT)
  } else { fmt.Println("TestAmazonSignature: Signature: OK") }
}

这是一个带有所有代码的游乐场link

1 个答案:

答案 0 :(得分:1)

对我来说很好,尝试运行:

https://play.golang.org/p/w0mQAYx2GQ

我添加了必要的导入和主要功能