我有一个应用程序应该是安全的,因此使用的是 Nonce,但我无法让它们工作。
我已经尝试了几个选项,但由于验证不起作用,显然缺少某些东西。

我的js代码片段是:

function placeNew(next){
  _nonce = $('input#_nonce').val();
  request = $.ajax({
    type: 'POST',
    url: url_path + '/foo/v1/newbee',
    data: {bid : next , _nonce : _nonce},
    security: '<?php echo wp_create_nonce( "a" ); ?>',
    dataType: 'json'
});
request.done(function (response, textStatus, jqXHR){
  str = JSON.stringify(response);
  if(response["error"]){
    alert(response["message"]);
  }

使用以下代码将随机数添加到页面中:
$nonce = wp_create_nonce( 'a' );
echo "<input type='hidden' id='_nonce' value=" . $nonce ."/>";

在 php 中,以下函数片段用于获取和比较随机数:
function ace($request) {
    global $wpdb;
    $timestamp = time();
    $nonce = (string) $request['_nonce'];
    $verify = check_ajax_referer( 'a', $nonce, false );
    if ( ! $verify){
        $errMsg = $nonce . '-'. $verify .' not validated ';
        return (object) array(error => true, message => $errMsg);
    }

我总是收到“未验证”的消息。 $nonce 有一个值,但 $verify 永远不会得到一个值。

最佳答案

根据 docs :



您缺少的重要部分是:



要使其工作,您必须将 wp_create_nonce 中的操作命名为 wp_rest

因此,对于您的代码,您必须更改以下所有实例:

wp_create_nonce( "a" )


wp_create_nonce( 'wp_rest' )

此外,正如文档所述:



所以将它添加到你的 ajax 很简单,看起来像:
var _nonce = "<?php echo wp_create_nonce( 'wp_rest' ); ?>";
$.ajax({
    type: 'POST',
    url: url_path + '/foo/v1/newbee',
    data: {
        bid : next
    },
    dataType: 'json',
    beforeSend: function ( xhr ) {
        xhr.setRequestHeader( 'X-WP-Nonce', _nonce );
    }
});

此外,为了修复检查
check_ajax_referer( 'a', $nonce, false )

现在应该是
check_ajax_referer( 'wp_rest', '_nonce', false )

关于php - 没有让 wordpress nonce 与 wp-rest api 应用程序一起使用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42179869/

10-12 00:51