Node.js HMAC SHA256在液体Shopify中的字符串与变量之间产生不同的结果

Node.js HMAC SHA256在液体Shopify中的字符串与变量之间产生不同的结果,node.js,shopify,liquid,sha256,hmac,Node.js,Shopify,Liquid,Sha256,Hmac,我正在Shopify网站和我的应用程序之间进行URL验证。在Shopify的.liquid文件中,我使用Shopify内置的HMAC_sha256字符串过滤器创建HMAC值。我正在使用一个秘密密钥和一个Twitch用户ID,我已经将其存储在客户标签中 散列值作为查询参数传递给my app,my app使用node.js中的加密模块生成散列,并将其与url中的散列进行比较 这里有些奇怪:在.liquid文件中,当我直接在字符串过滤器中键入Twitch ID时,.liquid文件生成的哈希值与我的应

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

散列值作为查询参数传递给my app,my app使用node.js中的加密模块生成散列,并将其与url中的散列进行比较

这里有些奇怪:在.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>
产生:

FCFEBC0D424982CE8C7A986264BEB0D4B1DE44507051451E142236404E5B9778 fcfebc0d424982ce8c7a986264beb0d4b1de44507501451e142236404e5b9778在我尝试在sha256过滤器中使用变量twitchId后,发现变量twitchId被实例化了。我在我的theme.liquid文件中实例化了它,我试图在我的应用程序中的liquid文件中访问它,来自Shopify站点的请求会得到liquid文件的响应

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


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

您需要显示如何将ID分配给变量。如果看不到这一点,就无法验证你的问题。你的思路是正确的。我只是在发现我的变量在尝试使用sha256过滤器之前不会被实例化之后添加了我自己的答案。与我的回答相关的附带问题,您知道theme.liquid文件是否在我的响应liquid文件之前加载?如果是这样,为什么只有javascript全局变量可以访问我的响应液体文件而不是液体变量?