前后端分离或者为了支持多个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; } }