我正在尝试使用Elixir编写亚马逊产品广告API客户端。开发者指南描述了签署API请求的过程,其中必须使用请求和“秘密访问密钥”创建HMAC-SHA26哈希。这是我编写的处理签署请求的函数:
defp sign_request(url) do
url_parts = URI.parse(url)
request = "GET\n" <> url_parts.host <> "\n" <> url_parts.path <> "\n" <> url_parts.query
url <> "&Signature=" <> :crypto.hmac(:sha256, 'ThisIsMySecretAccessKey', request)
end
传入该函数的URL看起来像这样:http://webservice.amazon.com/onca/xml?AssociateTag=ThisIsMyAssociateTag&AWSAccessKeyId=ThisIsMyAWSAccessKeyId&Keywords=stuff&Operation=ItemSearch&SearchIndex=Apparel&Service=AWSECommerceService&Timestamp=2014-11-22T12%3A00%3A00Z&Validate=True&Version=2013-08-01
我的问题是,虽然:crypto.hmac/3
返回一个二进制值,但该二进制值不是一个字符串。将返回值传递给String.valid?/1
将返回false
。因此,我无法将返回值连接到url字符串的末尾以对请求进行签名。
我是否错误地使用了:crypto.hmac/3
?我是否遗漏了什么?我应该用另一种方式进行吗?