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

CodeIgniter集成Firebase JWT报错:SignatureInvalidException类未找到

解决Class 'Firebase\JWT\SignatureInvalidException' not found错误

这个问题我之前在CodeIgniter项目里整合Firebase JWT时也碰到过,本质是JWT库的异常类没有被正确加载,下面是几个可行的解决办法:

  • 确认Firebase PHP-JWT库完整安装
    如果是用Composer管理依赖,先检查composer.json里是否包含"firebase/php-jwt": "^6.0"(或者你需要的对应版本),然后执行composer install或composer update,确保vendor/firebase/php-jwt/src目录下存在SignatureInvalidException.php等异常类文件。如果是手动下载的库,要把整个Firebase/JWT目录放到项目的libraries或vendor目录下,路径不能出错。

  • 配置自动加载

    • 如果你用Composer,打开CodeIgniter的application/config/config.php,设置$config['composer_autoload'] = TRUE;,这样Composer的自动加载器会帮你加载所有JWT相关的类,不需要手动require单个文件。
    • 要是手动引入文件,除了JWT.php,还要把相关异常类也引入,比如在控制器开头添加:
      require_once APPPATH . '/libraries/SignatureInvalidException.php';
      require_once APPPATH . '/libraries/ExpiredException.php';
      require_once APPPATH . '/libraries/BeforeValidException.php';
      
      注意路径要和你存放这些文件的实际位置一致。
  • 正确使用命名空间
    在控制器顶部加上这些类的use声明,这样后续捕获异常时就不用写完整的命名空间了:

    use \Firebase\JWT\JWT;
    use \Firebase\JWT\SignatureInvalidException;
    use \Firebase\JWT\ExpiredException;
    use \Firebase\JWT\BeforeValidException;
    

    之后在代码里捕获异常就可以直接写catch(SignatureInvalidException $e),不会出现类找不到的问题。

  • 检查文件权限与路径
    确认SignatureInvalidException.php文件确实存在,并且服务器有读取该文件的权限。另外,Linux系统下路径区分大小写,要确保文件名和引用时的大小写一致。

这里给你一个修改后的控制器示例片段,供参考:

<?php defined('BASEPATH') OR exit('No direct script access allowed');
require_once APPPATH . '/libraries/REST_Controller.php';

// 启用Composer自动加载的话,下面的require可以省略
// require_once APPPATH . '/libraries/JWT.php';
// require_once APPPATH . '/libraries/SignatureInvalidException.php';

use \Firebase\JWT\JWT;
use \Firebase\JWT\SignatureInvalidException;

class Welcome extends REST_Controller {
    public function __construct($config = 'rest') {
        parent::__construct($config);
        $this->load->model("Users_model");
    }

    public function login_post() {
        $username = $this->post('username');
        $password = $this->post('password');
        $invalidLogin = ['invalid' => $username];

        if(!$username || !$password){
            $this->response($invalidLogin, REST_Controller::HTTP_NOT_FOUND);
        }

        $id = $this->Users_model->checkLogin($username,$password);
        
        try {
            // 假设这里是生成JWT的逻辑
            $payload = [
                'iss' => 'your_app',
                'sub' => $id,
                'exp' => time() + 3600
            ];
            $secret_key = 'your_secret_key';
            $token = JWT::encode($payload, $secret_key);
            
            $this->response(['token' => $token], REST_Controller::HTTP_OK);
        } catch(SignatureInvalidException $e) {
            $this->response(['error' => 'Invalid token signature'], REST_Controller::HTTP_UNAUTHORIZED);
        }
    }
}

内容的提问来源于stack exchange,提问作者The Megamind

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:14:58