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';
- 如果你用Composer,打开CodeIgniter的
正确使用命名空间
在控制器顶部加上这些类的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
相关产品推荐
相关产品推荐

