要在 WordPress 中使用 firebase/php-jwt 库实现自定义 JWT(JSON Web Token)身份验证(而不是依赖插件),你可以通过创建一个自定义插件来完成。这种方式更灵活、可控,适合前后端分离、App 或自定义 API 项目。
下面是一个完整、安全、可运行的实现步骤:
✅ 第一步:安装 firebase/php-jwt
方法 A:使用 Composer(推荐)
在你的 WordPress 项目根目录(或插件目录)运行:
composer require firebase/php-jwt
如果你没有全局 Composer,可以先安装:https://getcomposer.org/
方法 B:手动引入(不推荐,但可行)
从 GitHub – firebase/php-jwt 下载源码,放入你的插件目录,然后用 require_once 引入。
✅ 第二步:创建自定义插件
在 wp-content/plugins/ 目录下新建文件夹,例如:my-jwt-auth,并在其中创建主文件 my-jwt-auth.php:
<?php
/**
* Plugin Name: My JWT Authentication for WordPress
* Description: Custom JWT auth using firebase/php-jwt
* Version: 1.0
*/
// 防止直接访问
defined('ABSPATH') || exit;
// 自动加载 Composer(如果你用的是项目根目录的 vendor)
// 如果你在插件内运行 composer,则路径为 __DIR__ . '/vendor/autoload.php'
require_once __DIR__ . '/vendor/autoload.php';
use Firebase\JWT\JWT;
use Firebase\JWT\Key;
// 定义密钥(建议放在 wp-config.php 中)
if (!defined('MY_JWT_SECRET_KEY')) {
define('MY_JWT_SECRET_KEY', 'your-very-strong-secret-key-change-in-production');
}
// 1. 注册登录路由:获取 token
add_action('rest_api_init', function () {
register_rest_route('my-jwt/v1', '/login', [
'methods' => 'POST',
'callback' => 'my_jwt_login_handler',
'permission_callback' => '__return_true',
]);
// 可选:注册受保护的测试路由
register_rest_route('my-jwt/v1', '/profile', [
'methods' => 'GET',
'callback' => 'my_jwt_profile_handler',
'permission_callback' => 'my_jwt_validate_token',
]);
});
// 2. 登录处理函数
function my_jwt_login_handler(WP_REST_Request $request)
{
$username = $request->get_param('username');
$password = $request->get_param('password');
if (!$username || !$password) {
return new WP_Error('missing_fields', 'Username and password required.', ['status' => 400]);
}
// 验证用户
$user = wp_authenticate($username, $password);
if (is_wp_error($user)) {
return new WP_Error('auth_failed', 'Invalid credentials.', ['status' => 401]);
}
// 生成 JWT
$issuedAt = time();
$expire = $issuedAt + 7 * DAY_IN_SECONDS; // 7天过期
$payload = [
'iss' => get_site_url(),
'iat' => $issuedAt,
'exp' => $expire,
'data' => [
'user_id' => $user->ID,
],
];
$jwt = JWT::encode($payload, MY_JWT_SECRET_KEY, 'HS256');
return new WP_REST_Response([
'token' => $jwt,
'user' => [
'id' => $user->ID,
'username' => $user->user_login,
'email' => $user->user_email,
'display_name' => $user->display_name,
],
], 200);
}
// 3. 验证 JWT 的中间件(用于 permission_callback)
function my_jwt_validate_token(WP_REST_Request $request)
{
$auth_header = $request->get_header('Authorization');
if (!$auth_header) {
return new WP_Error('no_token', 'Authorization header missing.', ['status' => 401]);
}
// 支持 "Bearer <token>" 格式
$parts = explode(' ', $auth_header);
if (count($parts) !== 2 || strtolower($parts[0]) !== 'bearer') {
return new WP_Error('invalid_format', 'Invalid Authorization header format.', ['status' => 401]);
}
$token = $parts[1];
try {
$decoded = JWT::decode($token, new Key(MY_JWT_SECRET_KEY, 'HS256'));
$user_id = $decoded->data->user_id;
if (!get_user_by('ID', $user_id)) {
return new WP_Error('user_not_found', 'User not found.', ['status' => 401]);
}
// 将用户 ID 存入全局,供后续使用
$request->set_param('jwt_user_id', $user_id);
return true; // 允许访问
} catch (Exception $e) {
return new WP_Error('invalid_token', $e->getMessage(), ['status' => 401]);
}
}
// 4. 受保护的示例路由
function my_jwt_profile_handler(WP_REST_Request $request)
{
$user_id = $request->get_param('jwt_user_id');
$user = get_user_by('ID', $user_id);
return new WP_REST_Response([
'message' => 'Protected route accessed successfully!',
'user' => [
'id' => $user->ID,
'name' => $user->display_name,
'email' => $user->user_email,
],
]);
}
✅ 第三步:配置密钥(安全!)
在 wp-config.php 中添加(比硬编码在插件里更安全):
define('MY_JWT_SECRET_KEY', 'your-ultra-secure-random-string-here');
🔐 生成强密钥:
访问 https://api.wordpress.org/secret-key/1.1/salt/ 复制任意一行即可。
✅ 第四步:启用插件
- 进入 WordPress 后台 → 插件
- 启用 “My JWT Authentication for WordPress”
- 确保你的服务器能传递
Authorization头(参考上一回答中的 Apache/Nginx 配置)
✅ 第五步:测试 API
1. 获取 Token
curl -X POST https://yoursite.com/wp-json/my-jwt/v1/login \
-H "Content-Type: application/json" \
-d '{"username":"admin","password":"your-password"}'
2. 使用 Token 访问受保护接口
curl -H "Authorization: Bearer YOUR_JWT_TOKEN" \
https://yoursite.com/wp-json/my-jwt/v1/profile
✅ 高级建议
- Token 刷新机制:可添加
/refresh路由,用旧 token 换新 token(需检查exp和用户状态) - 权限控制:在
my_jwt_validate_token中加入角色检查(如只允许subscriber以上) - 日志与监控:记录失败的 token 尝试,防止暴力破解
- HTTPS 强制:JWT 必须在 HTTPS 下使用!
🧩 扩展:集成到前端(如 React/Vue)
前端登录后保存 token(如 localStorage),每次请求带上:
fetch('/wp-json/my-jwt/v1/profile', {
headers: {
'Authorization': 'Bearer ' + localStorage.getItem('jwt_token')
}
})
如果你希望我提供 带刷新令牌(Refresh Token)、支持多设备管理 或 与 WooCommerce 集成 的版本,也可以告诉我!
0 条评论