WordPress rest-api 用户注册、找回密码和授权认证完整总结

1. 介绍
2. 用户注册、找回密码
3. 授权认证

介绍

官网:http://v2.wp-api.org/

4.4版本开始支持rest-api,以插件形式存在,4.7版本后系统内置。

多数情况下使用rest-api,是将WordPress为第三方授权认证可用,其实也完全可以将WordPress作为接口服务器,适用于各类SPA应用。

用户注册、找回密码

WordPress使用特有认证系统,即时安装JWT类认证插件也无法创建新用户,需要安装WP REST User插件来完成用户注册、找回密码。

wp-rest-user-icon插件地址:

https://wordpress.org/plugins/wp-rest-user/

使用rest-api注册一个用户,发送一个POST请求到:

/wp-json/wp/v2/users/register

JSON参数(设置头:content-type: application/ JSON):

{
"username": "new-user",
"email": "newuser@xxxxx.com",
"password": "123456",
}

(可选)要在用户注册后执行进一步的操作,添加钩子add_action:

add_action('wp_rest_user_user_register', 'user_registered');
function user_registered($user) {
// 执行操作
}

这个插件只允许注册用户为“订阅者”或“贡献者”角色,比较安全无害。如果有需要,这里就可将注册用户身份设置为作者:

$user->set_role('author');

使用REST API找回密码,发送一个POST请求到:

/wp-json/wp/v2/users/lost-password

JSON参数(设置头:content-type: application/ JSON):

{
"user_login": "newuser@xxxxx.com"
}

user_login可以是用户名或电子邮件。

授权认证

wpauthplugin

官方认证推荐OAuth 1.0a Server, Application Passwords, 和 JSON Web Tokens。

Authentication

Screen Shot 2020-12-04 at 1.33.10 PM

JWT插件地址:

JWT Authentication for WP REST API

1. 启用PHP HTTP授权头

编辑.htaccess文件添加:

SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]

RewriteCond %{HTTP:Authorization} ^(.*)
RewriteRule ^(.*) - [E=HTTP_AUTHORIZATION:%1]
</IfModule>

2. 配置密钥和开关

define('JWT_AUTH_SECRET_KEY', 'your-top-secret-key');
define('JWT_AUTH_CORS_ENABLE', true);

当插件被激活时,一个新的命名空间被添加:

/jwt-auth/v1

/wp-json/jwt-auth/v1/token | POST
/wp-json/jwt-auth/v1/token/validate | POST

3. 请求token

let reqUrl = 'http://xxxxx.com/wp-json/jwt-auth/v1/token';
axios.post(reqUrl, {
'username': 'jerry',
'email': 'jerry@xxxxx.com',
'password': '123456'
})
.then(function(response) {
console.log(response);
TOKEN = response.data.token;
})
.catch(function(error) {
console.log(error);
});

获取到token之后存cookie或localstorage中。

4. 请求接口

每次POST请求时都在header头带上token:

let reqUrl = 'http://xxxxx.com/wp-json/wp/v2/posts';
let headers = { 'Authorization': 'Bearer' + TOKEN };
axios.post(reqUrl, {
'title': '测试',
'content': '测试文章内容',
}, {
headers: headers
})
.then(function(response) {
console.log(response);
})
.catch(function(error) {
console.log(error);
});

附:

WordPress默认用户角色和权限:

https://gist.github.com/octalmage/d748456cfd48db849207

WordPress用户角色和权限完整版:

https://codex.wordpress.org/User_Levels#User_Level_2