我无法验证wp_create_nonce()在隐藏输入中创建的随机数,其名称为 html 表单中的随机数:
<input type="hidden" name="nonce" value="<?php echo wp_create_nonce('action_name'); ?>" />
表单提交是通过 ajax 完成并使用check_ajax_referer('action_name','nonce'). 这总是返回-1。所有 REST 端点都已经过测试,没有随机数并且可以 100% 正常工作。
这个问题似乎源于 wp 的用户识别。
到目前为止我的调试
随机数创建
在wp-includes/pluggable.php 中 wp_create_nonce('action_name')创建一个随机数散列各种变量,包括用户 ID 和操作。
Ajax 调用
我提交了一个调用check_ajax_referer('action_name','nonce'). 这反过来调用wp_verify_nonce($nonce,$action)which 通过散列相同的变量并比较两者来验证随机数。
逆向工程定位问题
我的问题是wp_create_nonce('action_name')使用正确的用户 ID 创建。但是,当我运行check_ajax_referer('action_name','nonce')which 调用wp_verify_nonce($nonce,$action)which 又调用wp_get_current_user(); 未找到用户(用户 ID 为 0)。
证据问题与用户 ID 有关
如果我临时编辑wp-includes/pluggable.php以强制使用我的用户 ID,则 nonce 验证工作正常。就好像对已知且有效的端点的 ajax 请求被视为用户已注销,无论他们是否注销。
我显然在这里遗漏了一些东西,但我不知道是什么。