PHP如何不使用Composer实现JWT?CodeIgniter4项目应用问询
CodeIgniter 4 无Composer集成JWT操作步骤
1. 准备JWT核心库文件
- 直接获取轻量PHP-JWT库的独立源码文件,不需要走Composer拉取,你可以直接把该库
src目录下的核心文件(JWT.php、Key.php、自定义异常类文件等)全部复制到你的CI4项目的app/Libraries/JWT目录下,没有对应目录自行新建即可 - 给所有JWT相关的文件调整命名空间,统一设置为
namespace App\Libraries\JWT;,和存放目录路径对应,适配CI4的自动加载规则
2. 配置JWT全局参数
- 打开项目
app/Config/Constants.php文件,在末尾添加JWT配置常量:
// JWT基础配置 define('JWT_SECRET', '你自己生成的32位以上高强度随机密钥'); define('JWT_ALG', 'HS256'); // 默认使用HS256加密算法 define('JWT_EXPIRE', 7200); // 令牌有效期,单位为秒,此处设置为2小时
注意密钥要妥善保管,禁止泄露到公开环境
3. 封装JWT工具类方便调用
在app/Libraries目录下新建JwtService.php文件,写入以下代码:
<?php namespace App\Libraries; use App\Libraries\JWT\JWT; use App\Libraries\JWT\Key; use Exception; class JwtService { /** * 生成JWT令牌 * @param array $userInfo 自定义业务数据 * @return string */ public function generateToken(array $userInfo): string { $payload = [ 'iss' => base_url(), // 签发方 'aud' => base_url(), // 接收方 'iat' => time(), // 签发时间 'nbf' => time(), // 生效时间 'exp' => time() + JWT_EXPIRE, // 过期时间 'data' => $userInfo // 自定义业务字段 ]; return JWT::encode($payload, JWT_SECRET, JWT_ALG); } /** * 验证JWT令牌 * @param string $token 前端传递的令牌 * @return array|false 验证成功返回自定义业务数据,失败返回false */ public function verifyToken(string $token) { try { $decoded = JWT::decode($token, new Key(JWT_SECRET, JWT_ALG)); return (array) $decoded->data; } catch (Exception $e) { // 令牌过期、签名错误、格式异常均返回失败 return false; } } }
4. 实际调用示例
4.1 生成令牌(登录接口场景)
在控制器中调用工具类生成返回令牌:
<?php namespace App\Controllers; use App\Libraries\JwtService; class Auth extends BaseController { public function login() { // 此处补充你的账号密码校验逻辑 $userInfo = [ 'user_id' => 1, 'username' => 'demo_user' ]; $jwtService = new JwtService(); $token = $jwtService->generateToken($userInfo); return $this->response->setJSON([ 'code' => 200, 'token' => $token, 'msg' => '登录成功' ]); } }
4.2 验证令牌(鉴权接口场景)
可以在控制器直接调用验证,也可以封装为全局过滤器统一校验:
public function getUserInfo() { // 获取请求头中的令牌 $token = $this->request->getHeaderLine('Authorization'); // 去除标准Bearer前缀 $token = str_replace('Bearer ', '', $token); $jwtService = new JwtService(); $userData = $jwtService->verifyToken($token); if (!$userData) { return $this->response->setJSON([ 'code' => 401, 'msg' => '令牌无效或已过期' ])->setStatusCode(401); } // 验证通过,处理后续业务逻辑 return $this->response->setJSON([ 'code' => 200, 'data' => $userData, 'msg' => '获取成功' ]); }
5. 注意事项
- 如果你的CI4关闭了自动加载规则,在使用前手动引入对应的JWT核心文件即可
- 生产环境必须使用高强度随机密钥,不要使用简单字符串作为密钥
- 敏感信息不要放入JWT的payload中,payload仅为base64编码可直接解码,禁止存放密码等隐私数据
内容的提问来源于stack exchange,提问作者Farooq Bellard
相关产品推荐
相关产品推荐

