新建一个全局function.php,
把下载好的文件,放在指定文件夹下,一般放在THINKPHP文件夹下
//引入相关文件
<?php require(THINK_PATH.'/Library/vendor/firebase/JWT/JWT.php'); require(THINK_PATH.'/Library/vendor/firebase/JWT/SignatureInvalidException.php'); require(THINK_PATH.'/Library/vendor/firebase/JWT/BeforeValidException.php'); require(THINK_PATH.'/Library/vendor/firebase/JWT/ExpiredException.php'); function getLoginToken($admin_user_id,$admin_user_name,$token_key="xzwk.tech",$add_time=10){ $now_time = time(); $token_data = array( 'iat'=>$now_time, //签发时间 'nbf'=>$now_time, //生效时间 'exp'=>$now_time+$add_time,//默认3600秒过期. 'data'=>array( // 输出的数据展示 'admin_user_id'=>$admin_user_id, 'admin_user_name'=>$admin_user_name ) ); $jwt = new \firebase\JWT\JWT(); $jwt_token = $jwt->encode($token_data,$token_key); if ($jwt_token){ // 如果存在token ,则把账号和token保存在session session('user_name',$admin_user_name); session('user_token',$jwt_token); return $jwt_token; }else{ return false; } } //这个是解密token函数 //$token_key="xzwk.tech" 随意传参 function decodeUserToken($user_token,$token_key="xzwk.tech"){ //$jwt = new \firebase\JWT\JWT(); //$token_data = $jwt->decode($user_token,$token_key,array('HS256')); //return $token_data; try { $jwt = new \firebase\JWT\JWT(); $return_login = $jwt->decode($user_token, $token_key, array('HS256')); }catch(\firebase\JWT\SignatureInvalidException $e) { //签名不正确 //echo $e->getMessage(); $return_login = false; }catch(\firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用 //echo $e->getMessage(); $return_login = false; }catch(\firebase\JWT\ExpiredException $e) { // token过期 //echo "这里可以输出错误信息:".$e->getMessage(); $return_login = false; }catch(Exception $e) { //其他错误 //echo $e->getMessage(); $return_login = false; //这个返回值false是在前端接受吗?对 } return $return_login; } //随机获取一个字符串 function randomStr(){ $str_random = null; $num = 6;// 字符串长度 $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz";//如果不需要小写字母,可以把小写字母都删除 $max = strlen($strPol)-1; for($i=0;$i<$num;$i++){ $str_random.=$strPol[rand(0,$max)];//rand($min,$max)生成介于min和max两个数之间的一个随机整数 } return $str_random; }
在用户登录控制器使用token验证,实现登录功能
验证密码,通过二次加密实现用户登录
if($user['password']!=$password_md5){ //echo "密码错误";exit; $return_data = array( 'code' =>1, 'msg' => '密码错误' ); }else{ //密码正确才给换token_key //把随机生成的字母保存到token_key列中 $user1 = M('admin_user'); $new_token_key = randomStr(); $data =array( 'token_key'=>$new_token_key ); $where=array( 'id'=> $user['id'] ); // 把数据对象添加到数据库 $user1->data($data)->where($where)->save(); session("user_id",$user['id']); session("user_name",$user['name']);//登录存SESSION用户名 session("user_token_key",$new_token_key);//登录存SESSION用户名 // 每次登录随机生成一个token——key 保存在数据库token_key列中 $user_token = getLoginToken($user['id'],$user['name'],$new_token_key,3600); //先注释掉了。正常不会在这里使用。 $user_token_data = decodeUserToken($user_token,$new_token_key); $return_data = array( //输出数据 'code' =>0, 'msg' => '密码正确', // 这下面部分数据只提供后台显示,不会在前台输出 'data'=>array( 'user_token'=>$user_token, 'user_id' =>$user_token_data -> data -> admin_user_id // 'user_token_data'=>$user_token_data ) ); } $this->ajaxReturn($return_data);
登录验证已经完成
================================================================================
退出登录,新建一个 public function logout(){
//清空session
session(null); //$admin=D('Admin'); //$admin->logout(); $this->success('退出成功!',U('Index/login'));
}
在前端退出标签使用当前控制器,
在首页控制器中,实现session判断,文件下
if ($user_name== '' || $user_name = null){ redirect('/Admin/Index/login'); } //实现了退出页面
==================================================================================
实现自动token续签,在当前控制器,加入判断