以管理员身份登录时,WP_VERIFY_NONCE始终返回FALSE

时间:2016-10-07 作者:Dmitriy Gamolin

我已经为我的插件实现了一些AJAX功能,只要我没有以管理员身份登录,它就可以正常工作wp_verify_nonce 失败。它适用于未经授权的用户和授权的普通用户。

这是我的PHP类(我删除了与问题无关的所有内容):

class My_Ajax {
    function __construct() {
        add_action( \'wp_ajax_geoip_citylist\', array($this, \'geoip_citylist\') );
        add_action( \'wp_ajax_nopriv_geoip_citylist\', array($this, \'geoip_citylist\') );
        add_action( \'wp_enqueue_scripts\', array($this, \'geoip_localize_js\'), 11 );
    }

    function geoip_citylist() {
        if ( ! wp_verify_nonce($_POST[\'geoipNonce\'], \'my_geoip_nonce\') ) {
            exit(\'Wrong nonce: \' . $_POST[\'geoipNonce\']);
        }
    }


    function geoip_localize_js() {
        wp_localize_script(
            \'my_custom_js\', \'myGeoipAjaxObject\', 
            array( 
                \'myGeoipNonce\' => wp_create_nonce(\'my_geoip_nonce\')
            ) 
        );
    }
}
下面是我的Javascript:

$.ajax({
    url: myMainAjaxObject.ajaxUrl,
    type: \'POST\',
    dataType: \'json\',
    data: {
        geoipNonce: myGeoipAjaxObject.myGeoipNonce,
        action: "geoip_citylist"
    },
    success: function(data) {
        replacePhones(data.user_city, data.current_phone, data.city_list);
    },
    error: function(error) {
        console.log(error);
    }
});
PHP错误响应中的nonce似乎是正确的,但由于某些原因,它仍然无法验证。

我花了几天的时间试图找出问题所在,并尝试用各种可能的方式在谷歌上搜索,但到目前为止,我找不到一个可行的解决方案。stackoverflow上也有类似的问题,如this one 创建于2011年。。。我可以假设nonces不适用于Wordpress中的管理员帐户,但我想在放弃之前至少得到一个确认。

UPDATE:我试着只使用我在这里提供的代码,结果仍然是相同的错误(我还仔细检查了缓存,它被刷新了)。

UPDATE 2:myMainAjaxObject 及其ajaxUrl 插入到另一个脚本中。由于每个AJAX请求的AJAX URL都是相同的,所以我只使用全局URL,而不是每次都重新定义它。所以这不是导致错误的原因。而且,如果它不被定义,它将永远不会起作用。再一次,它不仅适用于管理员,对于其他用户和未经授权的用户,它也可以正常工作。当我以管理员身份登录时,我确实在服务器响应中得到了“错误的nonce:73dd02f662”。所以我百分之百确定URL是正确的。

2 个回复
最合适的回答,由SO网友:Dmitriy Gamolin 整理而成

我想问题是我在测试时手动删除了几次cookie。其中有一个名为“wordpress\\u logged\\u in{token}”的cookie,其中{token}是唯一标识符。我的猜测是,缺少此cookie会导致nonce创建或/和验证出现问题。这很难注意到,因为我仍然能够浏览管理面板(看起来WP使用的是另一个名为“wordpress{token}”的cookie),而在前端,这个网站在任何地方都不会显示用户状态(那里没有使用帐户,但有登录功能,只是隐藏在视图中)。

解决方案非常简单——我只是重新登录为管理员,我的AJAX也开始为管理员工作。因此,如果有人遇到类似问题,请确保在清除cookie时,您要么只删除需要删除/重新生成的cookie,要么像我一样删除所有cookie,确保以管理员身份重新登录。

PS:很抱歉,我没有从一开始就提供所有细节,但我确实尽力提供了尽可能多的必要信息。我知道我错过了什么,现在我甚至问这个问题都觉得很愚蠢。然而,我不会删除它,这样可能会有人遇到同样的问题,可以节省一些时间。

SO网友:cybmeta

WordPress中的Ajax URL是这样的https://examle.com/wp-admin/admin-ajax.php. 当您未登录并且处于前端时,需要将URL传递给脚本。

在代码中,您使用的是:

url: myMainAjaxObject.ajaxUrl,
但是myMainAjaxObject.ajaxUrl 未定义。您可以这样做:

wp_localize_script(
    \'my_custom_js\', \'myGeoipAjaxObject\', 
    array( 
        \'myGeoipNonce\' => wp_create_nonce(\'my_geoip_nonce\'),
        \'ajaxUrl\'      => admin_url( \'admin-ajax.php\' )
    )
);
现在,您可以使用myMainAjaxObject.ajaxUrl 在前端和未登录用户。

相关推荐

尝试在WordPress中实现AJAX注释,遇到WP错误

我试图在WordPress中为我的评论实现Ajax,使用this tutorial. 但我在将教程中的代码集成到自己的预构建主题时遇到了问题。问题是,我要么得到一个WP错误“检测到重复注释;看来你已经说过了!”或标准500错误。以下是我得到的:下面是我对ajax的评论。js文件如下所示: * Let\'s begin with validation functions */ jQuery.extend(jQuery.fn, { /* * check i