猿问

无法使用 Golang 生成亚马逊产品 API 签名

我无法使用 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") }

}

这是包含所有这些代码的操场链接。


森栏
浏览 219回答 1
1回答

HUWWW

对我来说看起来不错,尝试运行:https://play.golang.org/p/w0mQAYx2GQ我添加了必要的导入和主要功能
随时随地看视频慕课网APP

相关分类

Go
我要回答