PHP JWT CI 框架
composer.json "require": { ... "nesbot/carbon": "^1.25", "firebase/php-jwt": "^5.0" }, /*** CI框架 helper自建文件 **************************/ /** * 校验jwt是否有效 * @param string $jwt * @return array|bool 有效则返回 jwt 数组,无效返回 false */ function jwt_verify($jwt) { $decoded = null; try { // config_item('encryption_key') CI框架config配置的随机字符串 $decoded = \Firebase\JWT\JWT::decode($jwt, config_item('encryption_key'), array('HS256')); } catch (\Firebase\JWT\ExpiredException $e) { // 过期 return false; } catch (\Exception $e) { return false; } /* * NOTE: This will now be an object instead of an associative array. To get * an associative array, you will need to cast it as such: */ return (array) $decoded; }
/**
* 学习文档
* https://jwt.io/
* https://github.com/firebase/php-jwts
*
* 生成jwt字符串
* @param array $payload 要在jwt中携带的信息
* @param int $exp 时间戳:过期时间;payload 和 exp 均不设置则永不过期
* @return string 生成的jwt字符串
*/
function jwt_encode($payload = [], $exp = 0)
{
/* jwt标准中注册的声明
array(
"iss" => "http://example.org", // jwt签发者
"sub" => "", // jwt面向的用户
"aud" => "http://example.com", // jwt接收者
"iat" => 1356999524, // jwt签发时间
"nbf" => 1357000000, // jwt生效时间,在该时间前一直无效
"exp" => 1520000000, // jwt的过期时间,这个过期时间必须要大于签发时间
"jti" => '', // jwt的唯一身份标识,主要用来作为一次性token,从而回避重放攻击。
);
*/
$now = time();
$_payload = array(
// "iat" => 1520000000,
// "nbf" => 1520000000,
"exp" => $now + 3600,
);
$payload = array_merge($_payload, $payload);
if ($exp > 0) {
$payload['exp'] = $exp;
}
// 签发服务器和验证服务器有时间差时设置,不要设置太大
// JWT::$leeway = 60;
// config_item('encryption_key') CI框架config配置的随机字符串
$jwt = \Firebase\JWT\JWT::encode($payload, config_item('encryption_key'));
return $jwt;
}
function check_login_status()
{
$CI = &get_instance();
// config_item('jwt_user_info_cookie_name') CI框架config配置的随机字符串
$jwt_user_info = $CI->input->cookie(config_item('jwt_user_info_cookie_name'));
$jwt = jwt_verify($jwt_user_info);
if(isset($jwt["user"])){
//兼容新SSO系统jwt
$user = (array)$jwt["user"];
$user_info = [
"username"=>$user["XXX"],
"user_id"=>$user["id"],
"ip"=>$user["ip"],
];
return $user_info;
}
return $jwt;
}
/***********************************************************
* 退出
***********************************************************/
public function logout()
{
$cookie_name = config_item('jwt_user_info_cookie_name'); // 键名
delete_cookie($cookie_name);
getJsonInstance()->code(0)->msg('退出成功')->out();
}
/*************************************************************
* 写入登录cookie
* @param $cookie_data
* @param bool $keep_30 记住密码30天
* @return string
**************************************************************/
private function set_login_cookie($cookie_data, $keep_30 = false)
{
// 保存 user_info 的 cookie 键名
$cookie_name = config_item('jwt_user_info_cookie_name');
$now = time();
if ($keep_30) {
// 30天免密登录
$exp = 3600 * 24 * 30;
$token = jwt_encode($cookie_data, $now + $exp);
// 设置 cookie ,有效期同token有效期
// CI框架的set_cookie方法传的exp是cookie有效时长,不是失效时间
set_cookie($cookie_name, $token, $exp);
} else {
// 普通登录
$exp = 3600 * 24;
$token = jwt_encode($cookie_data, $now + $exp);
// 设置 cookie ,有效期为会话有效期
set_cookie($cookie_name, $token, 0);
}
return $token;
}
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: