我正在Shopify网站和我的应用之间进行一些URL验证。在Shopify的.liquid文件中,我正在使用Shopify的内置hmac_sha256
字符串过滤器创建HMAC值。我正在使用存储在客户标签中的密钥和Twitch用户ID。
哈希值作为查询参数传递给我的应用,该应用使用node.js中的加密模块生成哈希并将其与url中的哈希进行比较。
在这里,事情变得很奇怪:在.liquid文件中,当我直接在字符串过滤器中输入Twitch ID时,.liquid文件生成的哈希值与我的应用程序生成的值相同,并且一切看起来不错:>
{{ "12345678" | hmac_sha256: "secret_key" }}
但是,当我将与变量相同的Twitch ID传递到字符串过滤器时,液体文件生成的哈希值与第一次不同:
{{ twitchId | hmac_sha256: "secret_key" }}
我已经尝试从Twitch ID变量中删除空格和换行符,以防万一。我什至没有猜测可能是什么问题。也许变量(是字符串)的编码方式与直接键入时的编码方式不同?
作为参考,检查匹配哈希的javascript代码:
// Get query string params:
const { hash, twitchId } = req.query;
console.log('Twitch ID in query: ' + twitchId);
// Verify user
const generatedUserHash = crypto
.createHmac('sha256', userVerifySecret)
.update(twitchId)
.digest('hex');
console.log('Passed hash: ' + hash + ' Generated hash: ' + generatedUserHash);
if (generatedUserHash == hash) {
return true;
} else {
return false;
}
答案 0 :(得分:1)
您需要显示如何将ID分配给变量。没有看到这一点,就无法验证您的问题。
我做了一个快速测试,并证明我得到了带有字符串和变量的相同的HMAC,所以一定是您在分配作业中做的很奇怪:
<h1>{{ "12345678" | hmac_sha256: "secret_key" }}</h1>
{% capture fizz %}12345678{% endcapture%}
<h1>{{ fizz | hmac_sha256: "secret_key"}}</h1>
产生:
fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778 fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778
答案 1 :(得分:0)
结果表明,在我试图在sha256过滤器中使用变量twitchId
后,实例化了该变量。我在theme.liquid文件中实例化了该文件,并尝试在我的应用程序中以液体文件访问它(Shopify网站的请求以液体文件响应)。
我想我错误地认为theme.liquid文件是在我对Shopify的响应中加载的。我之所以这么认为是因为我在theme.liquid文件中实例化的javascript变量在我的响应Liquid文件中可用(我认为这与在服务器端创建Liquid变量和在客户端创建javascript变量有关。 -侧)。
我现在在响应液体文件中实例化twitchId
变量。这样就解决了。