Я пытаюсь написать клиент API рекламы продукта Amazon в Elixir. В руководстве разработчика описывается процесс подписания запроса 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
? Есть что-то, что мне не хватает? Есть ли альтернативный способ, которым я должен заниматься?