WP-API检索草稿“Cookie nonce无效”

时间:2017-09-14 14:42:04

标签: php wordpress api nonce

我正在开发一个与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=16045802eeauth参数随后用于将请求发回到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) } }

有人能发现我在这里做错了吗? :/

感谢。

4 个答案:

答案 0 :(得分:1)

您面临两个问题:

  1. Wordpress&#34; nonce&#34;是一种仅用于防范CSRF令牌的工具。在为管理面板编写插件时非常有用,但对于针对API进行身份验证无用。

  2. 默认规定的.htaccess文件阻止通过API传递身份验证详细信息。

  3. 您需要通过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时,此问题已解决。