我正在开发一个与wordpress API相关的前端应用程序,该应用程序位于一个单独的域中。
我想要检索帖子草稿,所以当用户点击wordpress管理面板中的“预览帖子”时,它会打开我的应用程序并显示正确的内容。
我正在将一些Javascript加载到WP Admin中,因此我可以使用wp_nonce令牌修改管理面板中的所有“预览帖子”链接以进行身份验证。这是使用以下代码段完成的,该代码段将预览帖子链接调整为例如:http://example.com/blog?p=127&preview=true&auth=16045802ee
function admin_inline_js(){
// Grab URL
echo '
<script>
document.addEventListener("DOMContentLoaded", function() {
// Grab all preview anchors
var anchors = document.querySelectorAll("a[href*=\'preview=true\']"), i;
// Loop through and amend to remove the trailing slash, as WP doesnt provide any easy method to achieve this.
for(i = 0; i < anchors.length; i++) {
anchors[i].href = anchors[i].href.replace("blog/", "blog") + \'&auth=' . wp_create_nonce('wp_rest') .'\';
}
});
</script>
';
}
add_action( 'admin_print_scripts', 'admin_inline_js' );
在http://example.com/blog?p=127&preview=true&auth=16045802ee
,auth
参数随后用于将请求发回到wordpress以检索ID为127的草稿,其中包含16045802ee
的随机数标记。然而,这不起作用,我得到了这个回应:
object(stdClass)#459 (3) { ["code"]=> string(25) "rest_cookie_invalid_nonce" ["message"]=> string(23) "Cookie nonce is invalid" ["data"]=> object(stdClass)#532 (1) { ["status"]=> int(403) } }
有人能发现我在这里做错了吗? :/
感谢。
答案 0 :(得分:1)
您面临两个问题:
Wordpress&#34; nonce&#34;是一种仅用于防范CSRF令牌的工具。在为管理面板编写插件时非常有用,但对于针对API进行身份验证无用。
默认规定的.htaccess文件阻止通过API传递身份验证详细信息。
您需要通过API传递身份验证详细信息才能接收包含受保护数据的响应。为简单起见,我建议使用HTTP Basic Auth使其首先运行,可选择使用更安全的身份验证方法(如OAuth)来增强代码。
我建议专门为API使用创建新用户,而不是在服务器上的文本文件中传递管理详细信息。
创建用户后,您可以使用PHP中的简单cURL请求草稿帖子,如下所示:
$apiUsername = "apiuser";
$apiPassword = "sup3r-s3cr3t-p455w0rd";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "http://example.com/wp-json/wp/v2/posts/127");
curl_setopt($ch, CURLOPT_USERPWD, "$apiUsername:$apiPassword");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$json = curl_exec($ch);
$postObject = json_decode($json);
这将设置包含用户名和密码的请求标头,只要在到达Wordpress之前没有任何内容干扰此标头,您将在$postObject
收到您的帖子详细信息,您可以在这里停止阅读。你已经完成了。
但是,为了获得一些额外的乐趣,Wordpress规定的默认.htaccess
文件会丢弃HTTP标头,因此如果您正在使用它,则需要自行修复。基本上,Wordpress脚本需要在PHP_AUTH_USER
变量中看到PHP_AUTH_PW
和$_SERVER
个键才能生效。
快速解决方法是将以下规则作为.htaccess中的第一个RewriteRule包含在内:
RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]
将标题拆分为前缀为&#34; REMOTE_USER&#34;的变量,以下PHP可用于再次填充预期的字段(可能会进入index.php
)。
$userPass = $_SERVER["REDIRECT_REMOTE_USER"];
if(!empty($userPass)
&& strstr($userPass, "Basic")) {
$userPass = substr($userPass, strpos($userPass, " ") + 1);
$userPass = base64_decode($userPass);
$userPass = explode(":", $userPass);
$_SERVER['PHP_AUTH_USER'] = $userPass[0];
$_SERVER['PHP_AUTH_PW'] = $userPass[1];
}
答案 1 :(得分:0)
我发现此错误[{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}]
安装WP POS后,当POS页面打开时间ERROR“禁止”
扩展错误后
我收到此消息[{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}]
过了一会儿我找到了解决方案。我一个接一个地停用新安装的插件,我发现问题在“Yoast SEO”插件停用后它是POS插件工作正常,然后我再次激活Yoast SEO插件没问题它工作正常
答案 2 :(得分:0)
您需要将权限“ promote_users”添加到POS角色。我使用“用户角色编辑器”插件来执行此操作,但您也可以将以下内容添加到您的functions.php中:
$pos_role = get_role( 'pos' ); // Or whatever role you want to add it to
$pos_role->add_cap( 'promote_users' );
答案 3 :(得分:0)
我对代码进行了调试,并认为cookie已损坏。
在下面的代码段中,我们可以看到。
// Check the nonce.
$result = wp_verify_nonce( $nonce, 'wp_rest' );
if ( ! $result ) {
return new WP_Error( 'rest_cookie_invalid_nonce', __( 'Cookie nonce is invalid' ), array( 'status' => 403 ) );
}
对我来说,当我清除域的浏览器Cookie时,此问题已解决。