在WP4.7中REST API Cookie身份验证是如何工作的?

时间:2017-05-18 作者:dan9vu

虽然我已经登录,但我无法在前端创建帖子。WordPress始终返回401 Unauthorized 回答我已经甩了$_COOKIE 要确保已设置登录的cookie并获得如下内容:

array(1) {
  ["wordpress_logged_in_48f880f2beac6f39fb9ea8d9367e86d6"]=>
  string(125) "admin|1495526369|PwQIf1tAM5khs2f6LKMgf0T7fP1RwHjl9T6OWW90QfD|6d3373f1a05f2fcbfccc429035b0519a012d3224f725b82d6f253a98862b072d"
}
我已经阅读了整个REST API手册和许多TUT:

当您登录到仪表板时,这会为您正确设置cookie,因此插件和主题开发人员只需要有一个登录的用户。

但我不能让它工作。我是否遗漏了什么,或者它只在管理仪表板上工作?

以下是我的源代码:

// Localized data
/* <![CDATA[ */
var appData = {"routes":{"restUrl":"\\/wp-json\\/wp\\/v2"}};
/* ]]> */

// Post model
App.Model.Post = Backbone.Model.extend({
  urlRoot: appData.routes.restUrl + \'/posts\'
}

// Init
$(document).ready(function() {
  var post = new App.Model.Post({
    title: \'Posted via REST API\',
    content: \'Lorem Ipsum is simply dummy text of the printing and typesetting industry.\',
  });
  var xhr = post.save(null, {
    success: function(model, response, options) {
      console.log(response);
    },
    error: function(model, response, options) {
      console.log(response);
    }
  });
});

2 个回复
最合适的回答,由SO网友:birgire 整理而成

看来你错过了nonce 零件,如中所述Authentication REST API手册第章:

Cookie身份验证是WordPress中包含的基本身份验证方法。当您登录到仪表板时,这会为您正确设置cookie,因此插件和主题开发人员只需要有一个登录的用户。

然而,RESTAPI包含一种称为nonces的技术,以避免CSRF问题。这可以防止其他站点在没有明确意图的情况下强制您执行操作。这需要对API进行稍微特殊的处理。

对于使用内置Javascript API的开发人员,这将为您自动处理。这是推荐的插件和主题使用API的方法。自定义数据模型可以扩展wp。api。型号。Base,以确保为任何自定义请求正确发送。

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

基于Backbone JavaScript Client 第二章,我们可以使用核心wp-api REST API主干客户端库。

以下是您在/js/test.js 当前主题目录中的脚本文件:

wp.api.loadPromise.done( function() {

  // Create a new post
  var post = new wp.api.models.Post(
      {
        title: \'Posted via REST API\',
        content: \'Lorem Ipsum ... \',
        status: \'draft\',  // \'draft\' is default, \'publish\' to publish it
    }
  );

  var xhr = post.save( null, {
     success: function(model, response, options) {
       console.log(response);
     },
     error: function(model, response, options) {
       console.log(response);
     }
   });

});
在这里,我们将wp api客户端库和测试脚本排入以下队列:

add_action( \'wp_enqueue_scripts\', function()
{
    wp_enqueue_script( \'wp-api\' );
    wp_enqueue_script( \'test_script\', get_theme_file_uri( \'/js/test.js\' ), [ \'wp-api\' ] );

} );
functions.php 当前主题中的文件。

请注意,此测试脚本只是在前端的每个页面加载期间为具有创建新帖子能力的登录用户创建一个新的帖子草稿。

SO网友:nyedidikeke

You don\'t need 在从外部应用程序使用WordPress REST API之前,登录WordPress仪表板;it\'s irrelevant (当然,除非您在开发过程中希望依赖cookie)。

需要注意的是,您可能已经在服务器端启用了跨源资源共享(CORS),除非您使用的是来自同一源或同一服务器的资源。

您的HTTP响应头401指示已发送未经授权的请求进行处理,您的响应可能是:

{
  "code": "rest_cannot_edit",
  "message": "Sorry, you are not allowed to edit this post.",
  "data": {
    "status": 401
  }
}
换句话说,你要么not logged in 您请求的应用程序源于或执行操作的用户does not have the required permission to perform such an operation.

让我们假设这是第一种情况(未经验证的用户,在正常情况下拥有执行预期操作的所有权利);

显而易见的解决方案是在执行操作之前对用户进行身份验证,正如您所猜测的那样。

现在的问题是:如何通过内置的REST API对WordPress用户进行身份验证?

好消息是:根据您的需求和/或偏好,有一系列选项可供您选择。

下面的代码片段演示了在使用主干时应该如何操作。js公司:

wp.api.loadPromise.done(function() {
  // Create a new post
  var post = new wp.api.models.Post({
    title: \'Posted via REST API\',
    content: \'Lorem Ipsum is simply dummy text of the printing and typesetting industry.\',
  });
  post.save(null, {
    success: function(model, response, options) {
      console.log(response);
    },
    error: function(model, response, options) {
      console.log(response);
    }
  });
});
记住排队wp-api 在您的functions.php 或插件,如下所示:

/**
 * Either of the two can be used to enqueues in-built WP-API;
 * not both as any of them enables you achieve the same result: to enqueue wp-api.
 * The only difference between them is that one does it independently without any condition
 * while the other does so with a condition: to enqueue it as a dependency for your script.
 */
function wp_api() {
    // Use the line below to enqueue directly
    // (should your code directly reside in your functions.php or plugin).
    wp_enqueue_script( \'wp-api\' );

    // Use this option instead if you want to enqueue it (wp-api)
    // as a dependency for your script (here, located in a js file) so as
    // to ensure that your script gets loaded only after wp-api does as it depends on it.
    wp_enqueue_script( \'my_script\', \'path/to/my/script\', array( \'wp-api\' ) );
}
add_action( \'init\', \'wp_api\' );
。。。有关在WordPress REST API中使用主干JavaScript客户端的更多详细信息here.

结束

相关推荐

Cookies in template

我需要根据cookies只显示一次页面的某些部分。主要问题是我只能在插件中设置cookie,挂起init操作。我已经读了20页的谷歌,这个网站,问了2个论坛,但我仍然有这个问题。任何帮助都将不胜感激!