如何用代码实现 JWT Authentication for WP REST API 的功能
如果你不想使用插件,可以手动实现JWT Authentication for WP REST API。以下是实现过程:
- 安装一个JWT库 在你的WordPress项目中安装一个JWT库,例如firebase/php-jwt。你可以使用Composer进行安装:
composer require firebase/php-jwt
- 在WordPress中添加JWT支持 在你的主题或插件的
functions.php
文件中,添加以下代码以实现JWT生成和验证功能:
require_once 'vendor/autoload.php'; // 如果你使用Composer安装了firebase/php-jwt,请添加此行
use Firebase\JWT\JWT;
// 生成JWTfunction generate_jwt($user) {
$key = 'your-secret-key'; // 选择一个安全的密钥,不要泄露给任何人
$issuedAt = time();
$expirationTime = $issuedAt + (60 * 60); // 有效期为1小时
$payload = array(
'iat' => $issuedAt,
'exp' => $expirationTime,
'data' => array(
'userId' => $user->ID
)
);
return JWT::encode($payload, $key);
}
// 验证JWT
function verify_jwt($token) {
$key = 'your-secret-key';
try {
$decoded = JWT::decode($token, $key, array('HS256'));
return $decoded;
} catch (Exception $e) {
return null;
}
}
- 为用户登录添加REST路由 创建一个新的REST路由来处理用户登录。在
functions.php
中添加以下代码:
add_action('rest_api_init', function () {
register_rest_route('my_namespace/v1', 'login', array(
'methods' => 'POST',
'callback' => 'login_user',
));
});
function login_user(WP_REST_Request $request) {$username = $request->get_param('username');
$password = $request->get_param('password');
$user = wp_authenticate($username, $password);
if (is_wp_error($user)) {
return new WP_Error('invalid_credentials', '用户名或密码错误', array('status' => 401));
}
$jwt = generate_jwt($user);
return array('token' => $jwt);
}
- 验证请求 为了保护你的REST API端点,你需要验证请求中的JWT。创建一个函数来处理这个验证,并将其添加到
functions.php
文件中:
function jwt_authenticate_request(WP_REST_Request $request) {
$auth_header = $request->get_header('Authorization');
if (!$auth_header) {
return new WP_Error('missing_auth_header', '缺少授权头', array('status' => 401));
}
list($token) = sscanf($auth_header, 'Bearer %s');
if (!$token) {
return new WP_Error('invalid_auth_header', '无效的授权头', array('status' => 401));
}
$decoded = verify_jwt($token);
if (!$decoded) {
return new WP_Error('invalid_token', '无效的令牌', array('status' => 401));
}
$user_id = $decoded->data->userId;
$user = get_user_by('ID', $user_id);
if (!$user) {
return new WP_Error('user_not_found', '用户未找到', array('status' => 401));
}
wp_set_current_user($user_id);
return true;
}
- 为需要保护的REST API端点添加验证 将
jwt_authenticate_request
函数添加到需要保护的REST API端点的权限回调中。例如,如果你有一个名为my_endpoint
的端点,你可以这样保护它:
add_action('rest_api_init', function () {
register_rest_route('my_namespace/v1', 'my_endpoint', array(
'methods' => 'GET',
'callback' => 'my_endpoint_callback',
'permission_callback' => 'jwt_authenticate_request',
));
});
function my_endpoint_callback(WP_REST_Request $request) {
// 你的业务逻辑
return array('message' => '这是一个受保护的端点');
}
现在,当你访问my_endpoint
时,你需要在请求头中提供一个有效的JWT。如果没有提供有效的JWT,你将收到一个401未授权的错误响应。
以上就是在不使用插件的情况下,为WordPress REST API添加JWT身份验证的方法。请确保在实际环境中使用一个安全的密钥,并始终保持代码的安全性。

-
搭建一个WordPress网站需要多少成本 2023-11-06 00:09:51
-
Symlink介绍(附:如何使用Symlink进行WordPress开发) 2023-11-05 23:38:32
-
让WordPress实现数据库同步的插件:HyperDB 2023-10-24 23:40:49
-
allegro电商平台值得做吗(附:2023年Allegro注册流程指南) 2023-10-08 21:53:39
-
印度跨境电商平台有哪些(附:印度跨境电商做什么产品好) 2023-10-08 21:34:23
-
跨境电商必看的几大海外二手电商平台 2023-10-08 18:04:42
-
WordPress同城互联网产品解决方案:UBASE 2023-10-03 16:40:39
-
WordPress网站的安全插件:wordfence 2023-09-14 09:25:18
-
WordPress 6.3 支持在手动更新插件和主题失败后回滚旧版本 2023-08-28 16:58:45
-
WordPress 6.3版本(2023年8月)性能提升了哪些? 2023-08-28 16:56:02