从bundle.js中的FETCH请求调用时的REST API身份验证问题

时间:2019-07-16 作者:Sean D

我可以将Rest API用于不需要身份验证的调用,但对于需要身份验证的路由,我遇到了身份验证问题。这里是a的一部分。管理页面的php视图模板:

<div id="nonceCreator">
  <script>
    let _wpnonce = <?php echo json_encode(wp_create_nonce(\'wp_rest\')); ?>;

    let cookiesArray = <?php echo json_encode($_COOKIE) ?>;
  </script>
</div>

<div id="reactScriptInjection">
  <div id="adminRoot"></div>
  <script src="<?php echo PLUGIN_FOLDER_URL . "shared/" ?>adminArea.bundle.js"></script>
</div>
cookies数组和nonce似乎正确通过:

wordpress_69cb7e12fdbb27dfb56056fb4f6b39c8: "<username and long key removed>"
wordpress_logged_in_69cb7e12fdbb27dfb56056fb4f6b39c8: "<username and long key removed>"
wordpress_test_cookie: "WP Cookie check"
wp-settings-1: "unfold=1&mfold=o"
wp-settings-time-1: "1562861991
"=====cookiesArray====="

bac3c6<digits removed> =====_wpnonce=====
身份验证请求发回401个未经授权的消息,但是:

Promise {<pending>}
__proto__: Promise
[[PromiseStatus]]: "resolved"
[[PromiseValue]]: Object code: "rest_not_logged_in"
data: {status: 401}
message: "You are not currently logged in."
__proto__: Object
"=====response.json()====="
下面是api调用

// from the relevant react.js component\'s source
const getUserNameFromRestApi = () => {
    console.log(_wpnonce, `=====_wpnonce=====`);

    fetch(\'http://localhost/wptest2/?rest_route=/wp/v2/users/me\', {
      method : \'get\',
      mode : \'cors\',
      headers : {
        \'Access-Control-Allow-Origin\' : \'*\',
        \'X-WP-Header\' : _wpnonce
      }
    })
      .then(response => console.log(response.json(), `=====response.json()=====`))
      .catch(error => console.log(error, `=====error=====`));
  };
我认为在加载输出包时,访问控制源代码还不是一个因素。wordpress中管理页面中的js。

然而,我能够获得另一个插件来成功地进行身份验证获取。唯一的区别是插件并没有使用react。js,而是普通的javascript。

我认为COOKIE可能是问题所在,但您可以看到上面的$\\u COOKIE数组输出。另外,nonce在另一个插件中工作,所以我想我也在上面正确地设置了它。

那还能是什么呢?我认为数据流有问题。

1 个回复
最合适的回答,由SO网友:Sally CJ 整理而成

问题是您没有为REST API nonce头使用正确的名称;正确的名称是X-WP-Nonce, 但你用过X-WP-Header:

fetch(\'http://localhost/wptest2/?rest_route=/wp/v2/users/me\', {
  method : \'get\',
  mode : \'cors\',
  headers : {
    \'Access-Control-Allow-Origin\' : \'*\',
    \'X-WP-Header\' : _wpnonce // here you used the wrong name
  }
})
引用自REST API Handbook:

对于手动发出Ajax请求的开发人员,每个请求都需要传递nonce。API使用nonce,操作设置为wp_rest. 然后可以通过_wpnonce 数据参数(发布数据或在GET请求的查询中),或通过X-WP-Nonce header.

因此,请确保使用正确的标题名称。:)