没有让 wordpress nonce 与 wp-rest api 应用程序一起工作

Posted

技术标签:

【中文标题】没有让 wordpress nonce 与 wp-rest api 应用程序一起工作【英文标题】:Not getting wordpress nonce to work with wp-rest api application 【发布时间】:2017-06-30 00:15:40 【问题描述】:

我有一个应该是安全的应用程序,因此使用了 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 被添加到页面中,代码如下:

$nonce = wp_create_nonce( 'a' );
echo "<input type='hidden' id='_nonce' value=" . $nonce ."/>";

在 php 中,以下函数片段用于获取和比较 nonce:

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 永远不会得到一个值。

【问题讨论】:

【参考方案1】:

根据docs:

对于发出手动 Ajax 请求的开发人员,需要传递随机数 每个请求。 API 使用随机数并将操作设置为 wp_rest。这些 然后可以通过 _wpnonce 数据参数(POST 数据或在 GET 请求的查询中),或通过 X-WP-Nonce 标头。

您缺少的重要部分是:

API 使用随机数并将操作设置为 wp_rest。

要使其正常工作,您必须将 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 )

【讨论】:

如果您使用可以使用的标头路由,$request-&gt;get_header('X-WP-Nonce'); 获取 nonce 值(其中 $request 是传递给 wp-rest-api 端点回调的参数。 那么,如果您想从无法运行函数 wp_create_nonce 的外部服务调用 api 怎么办?是否有某种令牌或其他方式通过 api 进行身份验证以获得随机数? 鉴于 nonce 是由 WordPress 生成和验证的,您有 3 个选项。 1) 请求给你随机数,然后随请求一起发送 2) 实现你自己的令牌并在 WordPress 中验证它。 3)甚至不要使用nonce

以上是关于没有让 wordpress nonce 与 wp-rest api 应用程序一起工作的主要内容,如果未能解决你的问题,请参考以下文章

wp-json API 在使用 React 和 nonce 进行后期编辑时返回 401

wordpress检查

WordPress ajax 成功登录但未设置当前用户?

php WP Nonces.phtml

让 Wordpress 显示每月存档的代码?

访问 AWS EB PHP 5.4 上的 http X_* 标头