当使用带有客户端应用程序的用户登录到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
}
知道什么是错的吗?
答案 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。