WordPress Nonce没有验证

时间:2017-01-19 07:50:22

标签: php wordpress nonce

当使用带有客户端应用程序的用户登录到WordPress网站时,我有一个两步过程

第1步:客户端应用程序调用WordPress网站的API网址,它会创建一个随机数并将nonce令牌返回给应用。

$nonce = wp_create_nonce("my-action");

第二步:客户端应用程序使用带有GET请求的Web视图加载WordPress站点,其中包括GET参数中的随机数。然后验证现时。

 wp_verify_nonce( $_GET['token'], 'my-action' );

我用Postman和桌面浏览器模拟了这个。但是nonce无法验证。它总是失败。

这是我创建随机数的地方

if(username_exists($username)){
            $user = get_user_by('login', $username );

            $result['status'] = "already_registered";

            $token = sha1(date('H:i'));
            $result['token'] = $token;

            $result['nonce'] = wp_create_nonce("my-action");

            return $result;

        }

这是我检查现时的地方......

function userAuth(){

    echo $_GET['token'];

    $nonce = wp_verify_nonce( $_GET['token'], 'my-action' );

    //Do more things based on above verification

}

知道什么是错的吗?

1 个答案:

答案 0 :(得分:0)

当我的实时服务器WP站点上的wp_verify_nonce()从未返回true时,我遇到了这种情况。与此同时,我的舞台服务器上的网站副本(相同的代码)始终将其验证为真。

问题是同一页面,其中包含nonce的表单是打开两次(在不同的Chrome窗口中)来自同一个实时网站网址。页面的第二个副本在第一个副本打开的时间晚于第一个副本(比如15分钟后)。而且我忘记了第一个被打开的东西(它产生了不同的随机数与之前的时间联系在一起),试图让年轻的页面形式通过验证而没有成功。

原因是wp_verify_nonce()将较年轻的页面nonce与较旧的nonce进行比较。

即。 wp_create_nonce(),我在我的后端重复测试这个问题,给了我两个不同的nonce。我通过AJAX发送的隐藏表单字段中的那个字段以及wp_verify_nonce()检查行旁边的服务器AJAX处理程序中的不同字段。已禁用缓存的多个Ctrl-F5 +已打开的Chrome开发者工具网络无效。 Nonce是不同的。

只要关闭旧页面并清除新页面的缓存,nonce就会验证为true。