php ci try catch,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 协议》,转载必须注明作者和本文链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值