HMAC SHA256如果字符串与液体中的变量产生不同的结果,Shopify



我正在Shopify网站和我的应用程序之间进行URL验证。在Shopify上,在一个.lique文件中,我正在使用Shopify内置的hmac_sha256字符串过滤器创建一个HMAC值。我使用的是一个秘密密钥和一个Twitch用户ID,我已经将其存储在一个客户标签中。

哈希值作为查询参数传递给我的应用程序,该应用程序使用node.js中的加密模块生成哈希,并将其与url中的哈希进行比较。

这里的情况变得很奇怪:在.lilquid文件中,当我将Twitch ID直接输入字符串过滤器时,.lilquide文件生成的哈希值与我的应用程序生成的值相同,一切看起来都很好:

{{ "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;
}

您需要展示如何将ID分配给变量。如果看不到这一点,就无法验证你的问题。

我做了一个快速测试,证明我得到了相同的HMAC,有一个字符串和一个变量,所以你一定在做作业中的一些奇怪的事情:

<h1>{{ "12345678"  | hmac_sha256: "secret_key" }}</h1>
{% capture fizz %}12345678{% endcapture%}
<h1>{{ fizz   | hmac_sha256: "secret_key"}}</h1>

产品:

fcfebc0d424982ce8c7a986264 beb0d4b1de44507501451e1142236404e5b9778fcfebc0d424982ce8c7a986264 beb0d4b1de44507501451e1142236404e5b9778

在sha256过滤器中尝试使用变量twitchId后,发现它被实例化了。我在我的theme.loid文件中实例化了它,并试图在我的应用程序中的一个liquid文件中访问它(来自Shopify网站的请求会用一个liliquid文档响应(。

我想我在回复Shopify时错误地认为theme.lilquid文件是在文件之前加载的。我之所以这么认为,是因为我在我的主题.液体文件中实例化的javascript变量在我的响应液体文件中可用(我认为这与服务器端创建的液体变量和客户端创建的javascript变量有关(。

我现在正在我的响应液体文件中实例化twitchId变量。这就解决了问题。

最新更新