app登录的token设计

来源:互联网 发布:琼州海峡隧道 知乎 编辑:程序博客网 时间:2024/06/06 11:26

下面我来说一下我自己的思路:


1.登录的时候,登录成功之后,我们需要给他分配一个token。(1)token可以是文件的形式存着;(2)也可以存在数据库,但是存放在数据库,我个人不推荐,因为每次调用api接口都会对比,这样做法会加重服务器压力;(3)用redis存放token。

我个人强烈推荐的用redis,其次就是文件形式。今天我们重点说文件形式(放在下文去讲),不管什么形式,都一样的思路。


2.登录之后,我们要返回token,让安卓或者ios去保存这个token,以后每次操作都携带token去请求接口。


3.接下来就是我们要用它传给我们的token去对比,如果符合,那就正常返回数据,否则就返回一个标识,告诉app说这个token不符合,需要重新登录。我所有返回的接口方式都是统一的,例如:

我事先会告诉app前端,告诉他们说,如果是code等于1就说明返回的参数是正确的。等于0就弹出msg等等。。。还有一个很重要的,就是code等于10000就跳到登录页面。

exit( json_encode(array('code'=>'10000','msg'=>'请先登录!')) ); //token失效了或者token不对
exit( json_encode(array('code'=>'0','msg'=>'参数无效')) );      
exit( json_encode(array('code'=>'1','msg'=>'请先登录!','data'=>array())) ); //成功了,data就是返回的数据

上面的代码只是提供参考。


基本流程就是这样,接下来说的就是真正实现这个token了,token需要有哪些参数构成。(前面我说了,重点讲的是文件形式,或者你们也可以用来缓存在本地,方法大同小异,总之不建议放在数据库),不多说,直接贴代码

1.生成token的流程:每个用户,都只能有一个token文件,生成之前删除掉以前的token,避免冗余文件。

/* * 生成token   *返回一个token值   */private function get_token($userid){   $token=$userid.'_'.MD5($userid.uniqid().rand(00000000,99999999)); //随机数   $file_dir=APP_PATH.'token/'.$userid.'/';   if(!@is_dir($file_dir)){      @mkdir($file_dir,0777,true);   }else{  //删除之前所有的token文件      $dir_token=scandir($file_dir);      foreach($dir_token as $key => $value){         if($value == '.' || $value == '..'){}else{            unlink($file_dir.$value);         }      }   }   $fh = fopen($file_dir.$token,'w');   fwrite($fh,serialize(array('time'=>time(),'token'=>$token,'userid'=>$userid))); //这个根据自己的需求去对应的添加数据   fclose($fh);   return $token;}


2.app请求的接口传过来的token处理:判断时间是否过期,如果没有过期,可以考虑给它延长时间,不然会出现每天登录的情况。具体代码如下

在这个代码签名,有个全局变量:

public $userid=0;



$token=trim($this->input->post('token'))      if($token){   //1判断token文件是否存在,   /*2.存在:判断时间是否过期   2.1过期:删除原来的token文件并要求重新登录  2.2没有过期:赋值用户id    *3.不存在:要求重新登录    * */   $maxtime=86400 * 7;//7天过期时间设置(单位是秒)   $fcode = array();          //$this->newtoken=$token;   $user_id=strstr($token,"_",true);   $file=APP_PATH.'token/'.$user_id.'/'.$token;   if(file_exists($file)){ //1存在         $fh = @fopen($file,'r');         $fcode = unserialize(@fread($fh,filesize($file)));         @fclose($fh);         if($fcode['time']+$maxtime < time()){ //过期了            unlink($file);            $this->userid=0;         }else{  //没有过期            $this->userid=$fcode['userid'];            $expire_time=86400 * 2;//两天的时间  为了加快运行效率,在没有过期的情况下,两天后再延长时间,不影响任何地方            if($fcode['time']+$expire_time < time()){               $fh1 = fopen($file,'w');               fwrite($fh1,serialize(array('time'=>time(),'token'=>$token,'userid'=>$fcode['userid'])));               fclose($fh1);            }         }   }else{      $this->userid=0;   }   if($this->userid==0){         exit( json_encode(array('code'=>'10000','msg'=>'请先登录!')) );         }}
这样,我们就可以用token来获得用户的userid,然后用userid去操作了。是不是很简单。



这是第一次写博客,表达不清楚请谅解!!!