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 相关文章推荐
php Http_Template_IT类库进行模板替换
Mar 19 PHP
php实现mysql同步的实现方法
Oct 21 PHP
解析php根据ip查询所在地区(非常有用,赶集网就用到)
Jul 01 PHP
php中的四舍五入函数代码(floor函数、ceil函数、round与intval)
Jul 14 PHP
ThinkPHP中Session用法详解
Nov 29 PHP
如何使用Gitblog和Markdown建自己的博客
Jul 31 PHP
php session实现多级目录存放实现代码
Feb 03 PHP
php 基础函数
Feb 10 PHP
Centos 6.5下PHP 5.3安装ffmpeg扩展的步骤详解
Mar 02 PHP
PHP实现随机生成水印图片功能
Mar 22 PHP
PHP/ThinkPHP实现批量打包下载文件的方法示例
Jul 31 PHP
PHP简单验证码功能机制实例详解
Mar 27 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
PHP字符串的连接的简单实例
2013/12/30 PHP
php实现12306火车票余票查询和价格查询(12306火车票查询)
2014/01/14 PHP
PHP文字转图片功能原理与实现方法分析
2017/08/31 PHP
php学习笔记之字符串常见操作总结
2019/07/16 PHP
Laravel解决nesting level错误和隐藏index.php的问题
2019/10/12 PHP
IE 缓存策略的BUG的解决方法
2007/07/21 Javascript
JavaScript 动态改变图片大小
2009/06/11 Javascript
jquery 实现checkbox全选,反选,全不选等功能代码(奇数)
2012/10/24 Javascript
javascript的事件触发器介绍的实现
2014/06/05 Javascript
javascript实现tab切换特效
2015/11/12 Javascript
JavaScript纯色二维码变成彩色二维码
2020/07/23 Javascript
JS通过调用微信API实现微信支付功能的方法示例
2017/06/29 Javascript
vue自定v-model实现表单数据双向绑定问题
2018/09/03 Javascript
jQuery属性选择器用法实例分析
2019/06/28 jQuery
js实现简单页面全屏
2019/09/17 Javascript
async/await让异步操作同步执行的方法详解
2019/11/01 Javascript
JavaScript实现Tab标签页切换的最简便方式(4种)
2020/06/28 Javascript
Python实现基于权重的随机数2种方法
2015/04/28 Python
python数组过滤实现方法
2015/07/27 Python
python虚拟环境的安装配置图文教程
2017/10/20 Python
python搭建服务器实现两个Android客户端间收发消息
2018/04/12 Python
Python利用pandas处理Excel数据的应用详解
2019/06/18 Python
django框架创建应用操作示例
2019/09/26 Python
从pandas一个单元格的字符串中提取字符串方式
2019/12/17 Python
wxPython修改文本框颜色过程解析
2020/02/14 Python
Django-migrate报错问题解决方案
2020/04/21 Python
python中有帮助函数吗
2020/06/19 Python
Python列表嵌套常见坑点及解决方案
2020/09/30 Python
Python爬取梨视频的示例
2021/01/29 Python
初二物理教学反思
2014/01/29 职场文书
《美丽的小路》教学反思
2014/02/26 职场文书
党课知识竞赛主持词
2014/04/01 职场文书
银行竞聘演讲稿
2014/05/16 职场文书
夫妻忠诚协议范文
2014/11/16 职场文书
工伤认定行政答辩状
2015/05/22 职场文书
深入理解以DEBUG方式线程的底层运行原理
2021/06/21 Java/Android