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去操作了。是不是很简单。
这是第一次写博客,表达不清楚请谅解!!!
- app登录的token设计
- app的token与登录超时设计
- APP的token登录机制详解
- App RESTful登录设计(基于Spring及Redis的Token鉴权)
- App (客户端)登录接口设计Token探究(一)
- App之登录、access token、refresh token
- 基于springside4 的app token登录鉴权
- APP接口安全token设计
- # RESTful登录(基于token鉴权)的设计实例
- app接口设计之token的php实现
- app接口设计之token的php实现
- app接口设计之token的php实现
- app接口设计之token的php实现
- app接口设计之token的php实现
- 如何设计一款APP的登录模块
- app与后台的token、sessionId、RSA加密登录认证与安全解决方案
- app与后台的token、sessionId、RSA加密登录认证与安全解决方案
- app与后台的token、sessionId、RSA加密登录认证与安全解决方案
- 深入剖析ConcurrentHashMap--ALI大牛
- jQuery+正则+文本框限定
- UIButton 不响应或延迟响应 UIControlEventTouchDown
- 2017.12.5项目
- arduino学习笔记17.12.6
- app登录的token设计
- java文件流和管道流
- 使用alljoyn ios设备之间传输文件
- 免费发布信息网站有哪些?
- 关于使用idea工具debug时,断点颜色由红色变成灰色
- Unity中无法播放Animation问题
- [codeforces]750C
- 手把手教你Chrome浏览器安装Postman(含下载链接)
- MAC OS X下查看端口和杀死进程