收录了这篇文章
WordPress 5.6 以后内置了RESTful API,并且建议用户一定不要关闭,否则会影响WordPress后台的某些功能。调用某些接口的时候,会提示
{ code: "rest_cannot_edit", message: "抱歉,您不能编辑此用户。", data: {status: 401} }
Cookie Authentication 是 WordPress 内置的身份验证方法。登录仪表板时,会生成cookie。 但是,REST API包含一种称为nonce的技术来避免CSRF的问题。
使用内置Javascript API的开发人员,WordPress 会自动处理 nonce。自定义数据模型可以扩展wp.api.models.Base 确保为任何自定义请求正确发送。
对于自己启用 Ajax的情况,需要在请求的地址后面,加上一个 nonce 参数“_wpnonce”。可以使用 wp_create_nonce('wp_rest') 生成 _wpnonce。举个例子:
http://www.rangtuo.com/wp-json/wp/v2/users/2?_wpnonce=9aaea876fd
axios 例子:
var wpnonce = document.querySelector("input[name='wp_create_nonce']").value; var url = document.querySelector(".ajax-form").getAttribute("action") + "?_wpnonce=" + wpnonce; var userId = document.querySelector("input[name='id']").value; var formData = new FormData(); formData.append('id', userId); formData.append('nickname', '木瓜'); axios({ headers: { 'Content-Type': 'multipart/form-data' }, method: 'post', url: url, responseType: 'json', data: formData, }) .then(function (response) { console.log("response: ", response); }) .catch(function (error) { console.log("error:", JSON.stringify(error) ); });
如果用户处于登录状态,后端路由对应的方法可以获取用户信息和验证权限:
$user_id = get_current_user_id(); if(!user_can( $user_id, 'edit_posts')){ $wp_response = new \WP_REST_Response(array('error'=>'没有权限')); $wp_response->set_status(400); return $wp_response; }
如果不在登录状态会提示:
{"code":"rest_cookie_invalid_nonce","message":"Cookie 检查失败","data":{"status":403}}
除了这个,还有两种方式 处理接口权限的问题,推荐使用类似第三种 JSON Web Token.
Application Passwords
WordPress 5.6 以前是个插件,现在已经集成到WordPress中了。
functions.php 中添加 add_filter( ‘wp_is_application_passwords_available’, ‘__return_true’ ); 进行开启。然后在控制面板->所有用户->编辑用户中,即出现应用程序密码设置。或者使用基于 Cookie Authentication 的方法创建,相关接口参看:https://wordpress.org/plugins/application-passwords/
应用程序密码允许通过非交互式系统(例如XML-RPC或REST API)进行身份验证,而无需提供您的实际密码。应用密码很容易被撤销。它们不能用于通过传统方式登录您的网站。
JSON Web Tokens
插件地址: http://wordpress.org/plugins/jwt-authentication-for-wp-rest-api/
VScode RESTclinet 例子:
### POST http://www.rangtuo.com/wp-json/jwt-auth/v1/token content-type: application/json { "username": "test", "password": "123123" } ### GET http://www.rangtuo.com/wp-json/wp/v2/users/me/application-passwords Authorization: Bearer eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1LKJ9.eyJpc3MiOiJodHRwOlwvXC93d3cudmVyeXRoZW1lLmGJKSIsImlhdCI6MTYyNTg1NTU4NSwibmJmIjoxNjI1ODU1NTg1LCJleHAiOjE2MjY0NjAzODUsImRhdGEiOnsidXNlciI6eyJpZCI6IjEifX19.vgfz24DIDFddML3m4OplbJgvWcmCsktSdf14_Jhjkhjk
参考:http://developer.wordpress.org/rest-api/using-the-rest-api/authentication/
修改时间 2024-02-24