我正在使用ApiAuth gem(位于here中)对我的请求进行签名。我还使用CryptoJS(在here中发现)编写自己的JavaScript代码,以通过将ApiAuth生成的加密标头与我的代码生成的标头进行比较来提供身份验证。
下面给出的是ApiAuth Gem的代码片段:
def hmac_signature(headers, secret_key, options)
if options[:with_http_method]
canonical_string = headers.canonical_string_with_http_method(options[:override_http_method])
else
canonical_string = headers.canonical_string
end
digest = OpenSSL::Digest.new('sha1')
b64_encode(OpenSSL::HMAC.digest(digest, secret_key, canonical_string))
end
这是我用JavaScript编写的等效代码:
function hmacSignature(request, appSecret) {
return CryptoJS.HmacSHA1(canonicalString(request), appSecret).toString(CryptoJS.enc.Base64);}
这两个不会生成相同的加密头。我尝试使用jsSHA做同样的事情,虽然jsSHA和CryptoJS生成的加密头是相同的,但它们与ApiAuth生成的头不匹配。
请帮助我弄清楚如何进行这项工作。
编辑:
以Canonical String为“消息”,以appSecret为“ secret”,我从ApiAuth和CryptoJS获得相同的值,即:
DK9kn + 7klT2Hv5A6wRdsReAo3xY =
我发现原始代码中的问题来了,因为在我的JS代码中设置的时间戳和在ApiAuth中设置的时间戳不匹配。
最佳答案
我已解决问题,并正在写此答案,希望它可以帮助其他人寻求解决此问题的方法。
首先让我说,无论是用Ruby还是JS或任何其他语言进行加密,这两种加密都应该相同。
重要的是要检查发送到两个位置的输入的每个部分是否完全相同且完全相同。
当我检查对JS文件和gem的输入时,我意识到由于某种原因,时间戳(我在JS文件中设置)没有正确发送到gem。
我一步一步调试了代码,找出了错误所在。我概述了以下一些可能的问题:
我在JS中设置时间戳如下
request.headers [“ DATE”]
我意识到此设置不正确,因此我不得不将“ DATE”更改为“ DATE1”,并相应地更改了其余代码。这工作了。
其次,我发送的时间戳与gem期望的HTTP GST类型的时间戳不兼容。发送时间戳时,您还必须牢记另一件事。