我正在尝试在Elixir中编写Amazon Product Advertising API客户端。开发人员指南描述了the process for signing an API request,其中必须使用请求和“秘密访问密钥”创建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
我遇到的问题是,while:crypto.hmac/3
返回二进制文件,该二进制文件不是字符串;将返回值传递给String.valid?/1
会返回false
。因此,我无法将返回值连接到url字符串的末尾以对请求进行签名。
我不正确地使用:crypto.hmac/3
吗?有什么我想念的吗?我还有另一种方法吗?
当您使用:crypto.hmac/3
以二进制格式返回基数为16的整数时,您的问题可以像这样解决:
:crypto.hmac(:sha256, "key", "The quick brown fox jumps over the lazy dog")
|> Base.encode16