thinkphp5框架API token身份验证功能示例


Posted in PHP onMay 21, 2019

本文实例讲述了thinkphp5框架API token身份验证功能。分享给大家供大家参考,具体如下:

使用说明:登陆时生成token和刷新用的refresh_token,返回给客户端,客户端收到保存本地localStorage等,每次访问接口带上token,后端验证token存在并且一致后方可执行接下来的动作,假如不存在就返回token过期,客户端调用刷新接口传入token和refresh_token,服务器端进行验证,验证通过重新生成新的token保存数据库,返回给客户端客户端刷新本地token访问即可继续,当refresh_token验证失败就清除数据库token,过期时间等信息

简单的token生成函数(公共函数文件common)

function create_token($id,$out_time){
  return substr(md5($id.$out_time),5,26);
}

验证登陆方法(模型)

public function checkLogin($username,$passwd){
    $driver = self::field('driver_id,passwd')->where('zhanghao',$username)->whereOr('phone',$username)->find();
    if (empty($driver)){
      $this->error = '账号不存在';
      return false;
    }
    if ($driver['passwd'] != md5($passwd)){
      $this->error = "密码不正确";
      return false;
    }
    //$out_time = strtotime('+ 1 days');
    $out_time = strtotime('+ 1 minutes');
    $token = create_token($driver['driver_id'],$out_time);
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      $this->error = '登陆失败';
      return false;
    }
    $refresh_token_out_time = strtotime('+ 5 days');
    $refresh_token = create_token($driver['driver_id'],$refresh_token_out_time);
    Cache::set("token",$token,60);
    Cache::set("driver_id",$driver['driver_id'],$refresh_token_out_time);//设置ID的过期时间和更新token的token时间一样用于更新的时候获取用户信息
    Cache::set('refresh_token',$refresh_token,$refresh_token_out_time);
    return ['token'=>$token,'refresh_token'=>$refresh_token,'in_expire'=>$out_time];
}

token刷新方法(模型)

public function refreshToken($refresh_token,$token){
    if (!isset(Cache::get('refresh_token')) or Cache::get('refresh_token')!=$refresh_token){
      $this->error = '刷新token失败';
      return false;
    }
    $cache_driver_id = Cache::get('driver_id');
    $driver = self::field('driver_id,passwd')->where('driver_id',$cache_driver_id)->where('token',$token)->find();
    if (empty($driver)){
      $this->error = '参数错误';
      return false;
    }
    $out_time = strtotime('+ 1 days');//新的过期时间
    $token = create_token($driver['driver_id'],$out_time);//更新token
    if(false===self::save(['token'=>$token,'time_out'=>$out_time],['driver_id'=>$driver['driver_id']])){
      Cache::clear($token);
      $this->error = '刷新失败';
      return false;
    }
    Cache::set("token",$token,864000);
    return ['token'=>$token,'in_expire'=>$out_time];
}

退出方法(模型)

public function logout($token,$refresh_token=''){
    $driver = self::field('driver_id,passwd')->where('token',$token)->find();
    self::save(['token'=>'','time_out'=>''],['token'=>$token]);
    Cache::clear('token');
    Cache::clear('refresh_token');
}

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

PHP 相关文章推荐
MySQL中create table语句的基本语法是
Jan 15 PHP
php5 non-thread-safe和thread-safe这两个版本的区别分析
Mar 13 PHP
php设计模式 Mediator (中介者模式)
Jun 26 PHP
使用php测试硬盘写入速度示例
Jan 27 PHP
php中文验证码实现方法
Jun 18 PHP
PHP概率计算函数汇总
Sep 13 PHP
php生成curl命令行的方法
Dec 14 PHP
PHP+HTML+JavaScript+Css实现简单爬虫开发
Mar 28 PHP
PHP将字符串首字母大小写转换的实例
Jan 21 PHP
PHP调用接口用post方法传送json数据的实例
May 31 PHP
php-fpm中max_children的配置
Mar 15 PHP
Laravel jwt 多表(多用户端)验证隔离的实现
Dec 18 PHP
php curl操作API接口类完整示例
May 21 #PHP
PHP钩子实现方法解析
May 21 #PHP
php面向对象程序设计中self与static的区别分析
May 21 #PHP
PHP经典设计模式之依赖注入定义与用法详解
May 21 #PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 #PHP
PHP __call()方法实现委托示例
May 20 #PHP
PHP消息队列实现及应用详解【队列处理订单系统和配送系统】
May 20 #PHP
You might like
星际实力自我测试
2020/03/04 星际争霸
PHP输出控制功能在简繁体转换中的应用
2006/10/09 PHP
WordPress的主题编写中获取头部模板和底部模板
2015/12/28 PHP
利用PHP如何写APP接口详解
2016/08/23 PHP
TP5框架实现上传多张图片的方法分析
2020/03/29 PHP
Avengerls vs Newbee BO3 第一场2.18
2021/03/10 DOTA
jquery中ajax调用json数据的使用说明
2011/03/17 Javascript
javascript 系统文件夹文件操作及参数介绍
2013/01/08 Javascript
解析javascript系统错误:-1072896658的解决办法
2013/07/08 Javascript
JS Replace 全部替换字符的用法小结
2013/12/24 Javascript
dreamweaver 8实现Jquery自动提示
2014/12/04 Javascript
Node.js事件驱动
2015/06/18 Javascript
javascript原生ajax写法分享
2016/04/10 Javascript
URL的参数中有加号传值变为空格的问题(URL特殊字符)
2016/11/04 Javascript
Vue的土著指令和自定义指令实例详解
2018/02/04 Javascript
vue实现输入框的模糊查询的示例代码(节流函数的应用场景)
2019/09/01 Javascript
使用layui定义一个模块并使用的例子
2019/09/14 Javascript
微信小程序音乐播放器开发
2019/11/20 Javascript
python中的五种异常处理机制介绍
2014/09/02 Python
Python基于回溯法子集树模板实现8皇后问题
2017/09/01 Python
python2与python3共存问题的解决方法
2018/09/18 Python
Python3进制之间的转换代码实例
2019/08/24 Python
pytorch中获取模型input/output shape实例
2019/12/30 Python
大数据分析用java还是Python
2020/07/06 Python
python unichr函数知识点总结
2020/12/16 Python
HTML5 解析规则分析
2009/08/14 HTML / CSS
Html5移动端div固定到底部实现底部导航条的几种方式
2021/03/09 HTML / CSS
工程资料员岗位职责
2014/03/10 职场文书
机电一体化求职信
2014/03/10 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
社区党的群众路线教育实践活动总结材料
2014/10/31 职场文书
2019公司管理制度
2019/04/19 职场文书
手把手教你制定暑期学习计划,让你度过充实的暑假
2019/08/22 职场文书
详解CSS不受控制的position fixed
2021/05/25 HTML / CSS
python基础学习之递归函数知识总结
2021/05/26 Python
Python循环之while无限迭代
2022/04/30 Python