模块开发_token的解决方案

释意

token是一种特殊的字段
主要作用就是验证身份,可以理解为一种身份证
可以靠这个进入有要求的页面
可以给用户生成
必须是独一无二难以破解

设计思路

放再公共的文件内,通过初始函数调用的方式验证token就可以对全部的请求要求验证token,为了唯一性可以在其中加入时间戳,盐值等进行字段加密。

代码实现

生成token

可以选择在用户登陆的时候生成,然后保存在session中
首先用户登陆,然后后台自动创建一个token值保存给数据库

基础登陆
public function login()
    {
        //测试账号:AccountNumber jack  password myjack
        session_start();//开启session保存
        $webData = new WebData();//实例化
        //拿到数据,保存

        isset($_POST['AccountNumber']) ? $AccountNumber = $_POST['AccountNumber'] : '';
        isset($_POST['password']) ? $password = $_POST['password'] : '';
        //验证数据,不为空,数据字段长度,
        //应该使用Validate验证数据字段

        //数据库匹配账号密码
        $data = db::name('user')->where('account', $AccountNumber)->find();
        if ($data != null) {
            $is_true = password_verify($password, $data['password']);//判断密码是否和散列值匹配,密码在这里的传递过程中需要进行加密
            if ($is_true) {
                $msg['code'] = 200;
                $msg['msg'] = '登陆成功';
                $id = $data['id'];
                $_SESSION['id'] = $id;//用户名已经保存在数据库内
                //生成token,生成规则
                $token = openssl_encrypt($id, 'AES-128-ECB', 245184);
                //openssl_encrypt($data(加密明文), $method(加密方法), $password(加密秘钥), $options(数据格式选项(可选)), $iv(密初始化向量(可选)))
                //将token存入数据库内
                $data['token'] = $token;
            } else {
                $msg['code'] = 400;
                $msg['msg'] = '密码错误';
            }
            print_r($msg);
        }
    }

第二种token存储方法

public function login()
    {
        $this->all_header();
        if ($_SERVER['REQUEST_METHOD'] != 'OPTIONS') {
            isset($_POST['AccountNumber']) ? $AccountNumber = $_POST['AccountNumber'] : '';
            isset($_POST['password']) ? $password = $_POST['password'] : '';
            $data = db::name($this->tableName)->where('account', $AccountNumber)->find();
            if ($data != null) {
                $is_true = password_verify($password, $data['password']);
                if ($is_true) {
                    $userData['userID'] = password_hash($data['id'], PASSWORD_DEFAULT);
                    $userData['nickName'] = $data['nickname'];
                    $userData['legal_person'] = $data['legal_person'];
                    $userData['head_img'] = $data['head_img'];
                    $userData['token'] = $this->createToken($data['id'],$userData['userID']);
                    return json_encode($userData);
                } else {
                    $data = ['msg' => '用户名或密码错误'];
                    return json_encode($data);
                }
            } else {
                $data = ['msg' => '账号不存在'];
                return json_encode($data);
            }
        }
    }

写在公共文件夹下的创建token

//创建token
    public function createToken($id,$ID){
        $webData = new WebData();
        $status = $_SERVER['REQUEST_METHOD'];
        if($status!='OPTIONS'){
            $token = openssl_encrypt($ID, $this->encryptionType, $this->secretKey);
            $thisToken = db::name('user_token')->where('pid', $id)->find();
            $time = date('Y-m-d H:i:s',time());
            $tokenDay = $this->tokenDay;
            if ($thisToken == null) {
                $insertToken['value'] = $token;
                $insertToken['pid'] = $id;
                $insertToken['update_time'] = $time;
                $insertToken['expiration_time'] = date('Y-m-d H-i-s', strtotime("+10 seconds"));
                db::name($this->tokenTable)->insert($insertToken);
                return $token;
            } else {
                        $update['value'] = $token;
                        $update['pid'] = $id;
                        $update['update_time'] = $time;
                        $update['expiration_time'] = date('Y-m-d H-i-s', strtotime("+10 seconds"));
                        db::name($this->tokenTable)->where('pid',$id)->update($update);
                        return $token;
                    }
                }

            }

验证token

//定义token的属性文件
	public $tokenDay = 3;//token有效天数
    public $data = 'http://vytxx.cn';//域名,主要用在拼接文件
    public $encryptionType = 'AES-128-ECB';//token加密类型
    public $secretKey = '245184';//token秘钥
    public $tokenTable = 'user_token';

 //判断token返回代码
public function is_token(){
        $webData = new WebData();
        $status = $_SERVER['REQUEST_METHOD'];
        if($status!='OPTIONS'){
            $token = $_SERVER['HTTP_TOKEN'];
            $is_token = $webData->is_token($token);
            if ($is_token==1){
              return 1;
            }else{
                return json_encode($webData->getTokenError($token));
            }
        }
    }
    //验证token返回代码
    //返回token错误代码
    public function getTokenError($token)
    {

        $code = $this->is_token($token);
        if ($code == 2) {
            $data['code'] = 401;
            $data['token']=$_SERVER['HTTP_TOKEN'];
            $data['msg'] = 'token过期';

        } elseif ($code == 3) {
            $data['code'] = 401;
            $data['msg'] = 'token不存在';
        }
        return $data;
    }

写在公共文件类里面

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值