无法通过REST API从无头前端获取草稿帖子

时间:2020-04-01 作者:theLucre

我在上安装了一个无头Wordpressv5.4.0. 前端无法获取中的任何帖子draft 状态,但当直接访问API url时,返回的数据没有问题。我假设这与cookie/auth有关。注意,我动态地抓取nonce 来自后端的值,此处显示完整字符串以供参数使用。以下是我的设置和回复截图:

请求URL:http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true

使用在前端调用isomorphic-unfetch (也尝试了axios) 像这样:

fetch("http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true", {
  credentials: "include"
})
这是来自前端的请求/响应,它不起作用(这对所有人都起作用published 内容):

使用此正文:

{
  "code":"rest_forbidden",
  "message":"Sorry, you are not allowed to do that.",
  "data":{
  "status":401
  }
}
在尝试直接访问数据时,根据wpnonce 查询参数下划线:

这起作用(使用_wpnonce) 返回正确的JSON数据:

http://wordpress.test/wp-json/wp/v2/pages/19060?_wpnonce=23c01b3b12&_embed=true

详细信息:

这不会(使用wpnonce):

http://wordpress.test/wp-json/wp/v2/pages/19060?wpnonce=23c01b3b12&_embed=true

详细信息:

返回与前端相同的响应错误:

{
  "code":"rest_forbidden",
  "message":"Sorry, you are not allowed to do that.",
  "data":{
  "status":401
  }
}

EDIT:

我也试过X-WP-Nonce 此处提到的标题(https://developer.wordpress.org/rest-api/using-the-rest-api/authentication/) 而且似乎没有被认识到:

fetch(postUrl, {
  credentials: "include",
  headers: {
    "X-WP-Nonce": wpnonce
  }
})

{"code":"rest_cookie_invalid_nonce","message":"Cookie nonce is invalid","data":{"status":403}}

EDIT 2:

在一个干净的WP安装和一个新的裸体前端(html+jquery)上,我看到了同样的问题。但是,我发现nonce在生成预览链接时有效,但在WP尝试使用验证时无效rest_cookie_check_errors. 同一个nonce怎么能用同一个动作(wp_rest) 验证失败?:

我看到了wp_get_session_token() 失败,因为在REST请求上找不到cookie。(https://core.trac.wordpress.org/browser/tags/5.4/src/wp-includes/pluggable.php#L2140) 这不是nonce 不需要Cookie?跨域cookie路径是否存在问题?

我正在XHR中发送凭据。以下是我的前端测试代码:

// GET page with Nonce header
$.ajax({
  url: postUrl,
  method: "GET",
  xhrFields: {
    withCredentials: true
  },
  beforeSend: function(xhr) {
    xhr.setRequestHeader("X-WP-Nonce", wpnonce);
    xhr.setRequestHeader("Content-Type", "application/json");
  }
})
两个问题:

主要是,如何使用前端的nonce值获取草稿帖子数据_wpnonce / wpnonce 查询变量在前端和后端显示不同的结果

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

好吧,从技术上讲,我没有解决阻止我访问中帖子的问题draft 来自外部域的状态,其中前端托管仅使用nonce 价值观我猜logged_in 未在前端设置/无法读取cookie以验证nonce 外部AJAX请求期间的值。

也就是说,我为WP REST API插件安装了JWT身份验证(https://github.com/Tmeister/wp-api-jwt-auth) 现在需要管理员在前端预览页面上登录一次,以便在本地存储中设置令牌。

相关推荐

从Zillow API响应中提取XML/JSON元素并填充到重力表单字段中

给定此堆栈:WordPress 5.3重力表单2.4.15.6(付费:普通,对吗?)表单:第三方集成(免费:Link to WordPress plugin page)表单:第三方注入结果(免费:Link to WordPress plugin page)<Zillow GetSearchResults API(免费:Link to Zillow API)我已连接到Zillow的API并收到此文件中包含的响应:Link to 3rd-Party Integration debug text file