如何用代码实现 JWT Authentication for WP REST API 的功能

文 / @WordPress主题

如果你不想使用插件,可以手动实现JWT Authentication for WP REST API。以下是实现过程:

  1. 安装一个JWT库 在你的WordPress项目中安装一个JWT库,例如firebase/php-jwt。你可以使用Composer进行安装:
bash
composer require firebase/php-jwt
  1. 在WordPress中添加JWT支持 在你的主题或插件的functions.php文件中,添加以下代码以实现JWT生成和验证功能:
php
require_once 'vendor/autoload.php'; // 如果你使用Composer安装了firebase/php-jwt,请添加此行
use Firebase\JWT\JWT;
// 生成JWT
function 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;
}
}

  1. 为用户登录添加REST路由 创建一个新的REST路由来处理用户登录。在functions.php中添加以下代码:
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);
}

  1. 验证请求 为了保护你的REST API端点,你需要验证请求中的JWT。创建一个函数来处理这个验证,并将其添加到functions.php文件中:
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;
}

  1. 为需要保护的REST API端点添加验证 将jwt_authenticate_request函数添加到需要保护的REST API端点的权限回调中。例如,如果你有一个名为my_endpoint的端点,你可以这样保护它:
php
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身份验证的方法。请确保在实际环境中使用一个安全的密钥,并始终保持代码的安全性。

添加UTHEME为好友
扫码添加UTHEME微信为好友
· 分享WordPress相关技术文章,主题上新与优惠动态早知道。
· 微信端最大WordPress社群,限时免费入群。