WP-API 检索草稿 "Cookie nonce is invalid"

WP-API Retrieving Drafts "Cookie nonce is invalid"

我正在开发一个前端应用程序,它与位于单独域上的 wordpress API 相关联。

我想要检索 post 草稿,这样当用户在 wordpress 管理面板中单击 "Preview Post" 时,它会打开我的应用程序并显示正确的内容。

我正在将一些 Javascript 加载到 WP 管理中,这样我就可以使用 wp_nonce 令牌修改管理面板中的所有 "Preview Post" link 以进行身份​​验证.这是使用下面的代码片段完成的,该代码片段将预览 post link 调整为例如: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参数post请求返回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) } }

有人能看出我做错了什么吗? :/

谢谢。

您面临两个问题:

  1. A Wordpress "nonce" 是一种仅用于防止 CSRF 令牌的工具。在为管理面板编写插件时非常有用,但对于针对 API.

  2. 进行身份验证没有用
  3. 通过 API 传递身份验证详细信息被 default-prescribed .htaccess 文件阻止。

您需要通过 API 传递身份验证详细信息,以便接收包含受保护数据的响应。为简单起见,我建议首先使用 HTTP Basic Auth 使其工作,并可选择在将来使用更安全的身份验证方法(例如 OAuth)来增强您的代码。

我建议创建一个专门用于 API 用途的新用户,而不是在您服务器上的文本文件中传递管理员详细信息。

创建用户后,您可以在 PHP 中使用简单的 cURL 请求草稿 post,如下所示:

$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);

这将设置包含用户名和密码的请求 header,只要在它到达 Wordpress 之前没有任何干扰 header,您将在中收到您的 post 详细信息$postObject 你可以在这里停止阅读。大功告成。


但是,为了获得更多乐趣,Wordpress-prescribed 默认 .htaccess 文件会删除 HTTP headers,因此如果您正在使用它,则需要修复它你自己。基本上,Wordpress 脚本需要在 $_SERVER 变量中看到 PHP_AUTH_USERPHP_AUTH_PW 键才能工作。

快速修复是将以下规则作为第一个 RewriteRule 包含在 .htaccess 中:

RewriteRule .* - [E=REMOTE_USER:%{HTTP:Authorization}]

这会将 header 拆分为以 "REMOTE_USER" 为前缀的变量,下面的 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];
}

我发现了这个错误 [{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}] 我安装WP POS 后,当POS 页面打开时间错误"forbidden"

展开错误后 我收到此消息 [{"code":"json_cookie_invalid_nonce","message":"Cookie nonce is invalid"}]

过了一会儿我找到了解决办法。我一个一个地停用新安装的插件,停用后我在 "Yoast SEO" 插件中发现问题它是 POS 插件工作正常,然后我再次激活 Yoast SEO 插件没问题它工作正常

您需要为 POS 角色添加权限 "promote_users"。我使用 "User Role Editor" 插件来执行此操作,但您也可以将以下内容添加到您的 functions.php:

$pos_role = get_role( 'pos' ); // Or whatever role you want to add it to
$pos_role->add_cap( 'promote_users' );

我调试了代码,认为 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 时,这个问题就解决了。