WordPress 以登录用户身份创建随机数,但验证不正确

WordPress is creating nonce as a logged in user but verifying it incorrectly

我无法验证在隐藏输入中使用 wp_create_nonce() 创建的 nonce,其名称为 nonce,格式为 html:

<input type="hidden" name="nonce" value="<?php echo wp_create_nonce('action_name'); ?>" />

表单提交通过 ajax 完成并使用 check_ajax_referer('action_name','nonce') 验证。这总是 returns -1。所有 REST 端点都在没有随机数的情况下进行了测试,并且可以 100% 正常工作。

这个问题似乎源于 wp 的用户身份。

到目前为止我的调试

Nonce 创建
wp-includes/pluggable.php wp_create_nonce('action_name') 中创建一个随机数哈希各种变量,包括用户 ID 和操作。

Ajax来电
我提交了一个调用 check_ajax_referer('action_name','nonce') 的 ajax 调用。这反过来调用 wp_verify_nonce($nonce,$action),它通过散列相同的变量并比较两者来验证随机数。

逆向工程定位问题
我的问题是 wp_create_nonce('action_name') 是用正确的用户 ID 创建的。但是,当我 运行 check_ajax_referer('action_name','nonce') 调用 wp_verify_nonce($nonce,$action) 又调用 wp_get_current_user() 时;未找到用户(用户 ID 为 0)。

证据表明问题与用户 ID

有关

如果我临时编辑 wp-includes/pluggable.php 以强制我的用户 ID,随机数验证工作正常。就好像 ajax 对已知且有效端点的请求被视为用户已注销,无论他们是否注销。

我显然在这里遗漏了一些东西,但我不知道是什么。

发生这种情况是因为带有操作 wp_rest 的单独随机数没有被服务器发送到客户端并在 HTTP 请求中从客户端接收回来header 为每个 REST 请求调用 X-WP-Nonce

要使其正常工作,您必须生成这样的随机数:

wp_create_nonce('wp_rest')

...并将其提供给进行其余调用的客户。一旦您的客户端具有随机数值,您需要将其添加到每个 REST 请求中,例如:

headers: {
    'X-WP-Nonce': nonce,
}

可以通过多种方式在服务器上创建随机数并在客户端访问它。使用 wp_localize_script() 是 WordPress 最常见且可能是最佳实践。 wp_localize_script() 向客户端添加一个全局变量以供脚本访问。参见 https://developer.wordpress.org/reference/functions/wp_localize_script/