如果字符串与 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
变量。这样就解决了。
我正在 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
变量。这样就解决了。