JWT应用场景
点击登入颁发token,下次请求带着token请求,对接口安全有保障,不会任何人都可以请求接口
JWT的优点
JWT的优点:用户会话信息保存在客户端,服务端再也不用操心用户的会话信息,即服务端无状态
JWT的缺点:只能被动等到token过期,不能主动失效token
导入文件到vendor目录下面,可以看我上传的jwt文件
下面是代码
//生成验签
function signToken($ip){
$key="dt".$ip; //这里是自定义的一个随机字串,应该写在config文件中的,解密时也会用,相当 于加密中常用的 盐 salt
$token=array(
"iss"=>$key, //签发者 可以为空
"aud"=>$ip, //面象的用户,可以为空
"iat"=>time()-3600, //签发时间
"nbf"=>time()-3600, //在什么时候jwt开始生效 (这里表示生成1秒后才生效)
"exp"=> time()+7200, //token 过期时间,这里表示一个星期(60*60*24*7)=604800
// "data"=>[ //记录的data的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对
// "series_id"=>$series_id,
// "user_id"=>$user_id,
// "power"=>$user_power
// ]
);
// $jwt = JWT::encode($token, $key); //原先写的,本地可以调用,现在线上不行,所以改为手动调用
// print_r($token);
vendor('Firebase.php-jwt.src.JWT');
// $JWT=new \Firebase\JWT\JWT();
$jwt = \Firebase\JWT\JWT::encode($token, $key,"HS256");
return $jwt;
}
//验证token
public function _initialize()
{
vendor('Firebase.php-jwt.src.JWT');
$code = input();
$status=array("code"=>500);
if ($code['token']) {
$ip=$this->request->ip();
$key="dt".$ip;
try {
//JWT::$leeway = 60;//当前时间减去60,把时间留点余地
$decoded = \Firebase\JWT\JWT::decode($code['token'], $key, array('HS256')); //HS256方式,这里要和签发的时候对应
// $arr["data"]['token'] = (array)$decoded;
// $arr['code']=200;
// $arr['msg']="token验证通过";
// echo json_encode($arr);
} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确
$status["msg"]="签名不正确";
echo json_encode($status);
exit();
}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用
$status["msg"]="token失效";
echo json_encode($status);
exit();
}catch(\Firebase\JWT\ExpiredException $e) { // token过期
$status["msg"]="token失效";
echo json_encode($status);
exit();
}catch(Exception $e) { //其他错误
$status["msg"]="未知错误";
echo json_encode($status);
exit();
}
}else{
$status["msg"]="没有token";
echo json_encode($status);
exit();
}
}