Codeigniter控制器无session/cookie时如何传递函数计算值到其他方法
问题根源
你当前调用auth()返回null的直接原因:
auth()方法只有当请求携带adminEmail、adminPassword两个POST参数时,才会进入逻辑分支执行return语句;如果调用时没有对应POST参数,最外层的参数校验判断不触发,方法无返回值,自然得到null。- 你的需求是同一控制器内跨方法共享生成后的
$jwtoken,不需要依赖Session、Cookie即可实现。
解决方案
分两种场景适配:
场景1:同一次HTTP请求内多方法共享
比如addNew方法是在登录验证的同一次请求中调用,直接用控制器类属性存储令牌即可:
- 在控制器中声明公共属性用来全局存储JWT令牌
- 验证通过后将令牌赋值给类属性,所有方法直接访问该属性即可获取值
改造后的示例代码:
<?php class Employees extends CI_Controller { // 声明全局存储jwt的类属性 public $jwtoken = ''; public function __construct() { parent::__construct(); } public function auth() { $adminEmail = $this->input->post('adminEmail'); $adminPassword = $this->input->post('adminPassword'); if ($adminEmail != "" && $adminPassword != "") { // 提示:这里改用查询绑定避免SQL注入风险 $query = $this->db->query("select * from admin_tbl where email= ? and password = ?", [$adminEmail, $adminPassword]); if ($query->num_rows() <= 0) { $response = array(); $this->jwtoken = ""; $this->session->set_flashdata("invalid", "Wrong email or password"); $response = array( 'status' => 'invalid', 'message' => $this->session->flashdata("invalid"), 'token' => $this->jwtoken, ); $this->output ->set_content_type('application/json') ->set_output(json_encode($response)); return $this->jwtoken; } else { $response = array(); $jwt = new JWT(); $data = array( 'adminEmail' => $adminEmail, 'iat' => time() ); // 生成jwt后赋值给类属性 $this->jwtoken = $jwt->encode($data, jwtSecretKey, 'HS256'); $this->session->set_flashdata("login", "Successfully login!"); if ($this->jwtoken != "") { $response = array( 'status' => 'valid', 'message' => $this->session->flashdata("login"), 'token' => $this->jwtoken ); } $this->output ->set_content_type('application/json') ->set_output(json_encode($response)); return $this->jwtoken; } } // 无POST参数时直接返回已存储的token return $this->jwtoken; } public function addNew() { $response = array(); // 直接获取令牌即可,也可以直接访问$this->jwtoken $token = $this->auth(); var_dump($token); } } ?>
场景2:跨HTTP请求共享(登录后访问其他接口)
JWT的原生设计就是不依赖服务端会话,你只需要要求客户端登录成功后把返回的token存储在本地,后续请求时放在Authorization请求头中携带,你可以在控制器的构造方法中统一解析头中的令牌,赋值给类属性,所有方法都可以直接获取:
public function __construct() { parent::__construct(); // 统一解析请求头中的JWT $header = $this->input->get_request_header('Authorization'); if ($header) { $token = str_replace('Bearer ', '', $header); // 这里可以加JWT验证逻辑,验证通过后赋值给类属性 $this->jwtoken = $token; } }
内容的提问来源于stack exchange,提问作者Muhammad Bilal
相关产品推荐
相关产品推荐

