tp3.2使用php-jwt插件,生成获取token实现登录密码加密,和实现token续签等

新建一个全局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续签,在当前控制器,加入判断

 

 

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值