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

HMAC SHA256 Produces Different Result if String vs Variable in Liquid, Shopify

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

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

事情变得奇怪了:在 .liquid 文件中,当我将 Twitch ID 直接输入字符串过滤器时,.liquid 文件生成的哈希值与我的应用程序生成的值相同,一切看起来都不错:

{{ "12345678" | hmac_sha256: "secret_key" }}

但是,当我将相同的 Twitch ID 作为 变量 传递给字符串过滤器时,liquid 文件生成的哈希值与第一次不同:

{{ 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>

生产:

fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778 fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778

原来我的变量 twitchId 在我尝试在 sha256 过滤器中使用它之后被实例化了。我在我的 theme.liquid 文件中实例化了它,并且我试图在我的应用程序中的液体文件中访问它(来自 Shopify 网站的请求是用液体文件响应的)。

我想我错误地假设 theme.liquid 文件在我对 Shopify 的回复中的文件之前加载。我假设这是因为 javascript 我在 theme.liquid 文件 中实例化的变量 在我的响应液体文件中可用(我认为这与正在创建的液体变量有关服务器端和 javascript 正在客户端创建的变量)。

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