我可以将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在另一个插件中工作,所以我想我也在上面正确地设置了它。
那还能是什么呢?我认为数据流有问题。
最合适的回答,由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.
因此,请确保使用正确的标题名称。:)