WordPress RESTful API 的授权方式
WordPress 开发文档
收录了这篇文章

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

声明:本站所有文章和图片,如无特殊说明,均为原创发布。商业转载请联系作者获得授权,非商业转载请注明出处。
随机推荐
Content Security Policy(CSP)简介
Nginx 的 location 设置
Web 自定义组件
Node.js 数据库模块 mysql2
WordPress 函数 add_option()、get_option() 和 update_option()
WordPress 添加文章自定义字段
River 主题
SQL 注入的生命力