api身份校验之token

前后端分离或者为了支持多个web应用,那么原来的cookies或者session在使用上就会有很大的问题
所以我们用到了token

使用方式

1.前端传登陆信息【账号密码验证码之类的】给后端

2.后端验证登陆信息,生成唯一身份标识token绑定到用户,并返回给前端

3.前端将token存入缓存,在每次请求时,在header或url中将token传给后端

4.将前端传来的token与后端的token作比对,并验证过期时间,返回结果给后端

 

数据库设计:

 

 

 

 

php代码:

    // 测试是否登陆
    public function cehckLogin(){
        if(empty( $this->headers['token'])){
            AException('token校验失败', 401);
        }
        $user = model('User')->where(['token' => $this->headers['token']])->find();

        if(!$user){
            AException('token校验失败', 401);
        }
        if($user->token_timeout < time()){
            AException('token过期', 401);
        }
        // token续期
        $code_out = time() + 60*60*24* config('IAuth.token_time');
        model('User')->where(['token' => $this->headers['token']])->update(['token_timeout' => $code_out]);
        return $user->id;
    }


    // 设置唯一的token
    public static function setAppLoginToken($userid = ''){
        $str = md5(uniqid(md5(microtime((true)),true)));
        $str = sha1($str.$userid);
        return $str;
    }

 

    // 更新token
    public function updateToken($id, &$token, &$token_timeout){
        $token = 0;
        $token_timeout = 0;

        $code = IAuth::setAppLoginToken($id);
        $code_out = time() + 60*60*24* config('IAuth.token_time');
        $res = $this->where(['id' => $id])->update(
            ['token' => $code, 'token_timeout' => $code_out]
        );
        if($res){
            $token = $code;
            $token_timeout = $code_out;
        }
    }

 

posted @ 2020-03-16 23:36  cl94  阅读(615)  评论(0编辑  收藏  举报