You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 22:36:08