目录
一: Token运用
1.app登陆成功,生成一个token;
(1)token可以是文件的形式存着;
(2)也可以存在数据库,但是不建议存放在数据库,因为每次调用api接口都会对比,这样做法会加重服务器压力;
(3)用redis存放token,推荐;
2.登录成功之后,服务端返回token,让安卓或者ios去保存这个token,以后每次操作都携带token去请求接口。
3.接下来就是我们要用它传给我们的token去对比,如果符合,那就正常返回数据,否则就返回一个标识,告诉app说这个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去操作了;