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的ASP防火墙
Oct 09 PHP
杏林同学录(八)
Oct 09 PHP
PHP 设计模式之观察者模式介绍
Feb 22 PHP
PHP容易忘记的知识点分享
Apr 30 PHP
PHP和JavaScrip分别获取关联数组的键值示例代码
Sep 16 PHP
PHP中isset与array_key_exists的区别实例分析
Jun 02 PHP
PHP函数nl2br()与自定义函数nl2p()换行用法分析
Apr 02 PHP
php数据库操作model类(使用__call方法)
Nov 16 PHP
PHP实现防盗链的方法分析
Jul 25 PHP
yii2.0整合阿里云oss的示例代码
Sep 19 PHP
Yii2框架数据验证操作实例详解
May 02 PHP
yii2.0框架场景的简单使用示例
Jan 25 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 gd2 上传图片/文字水印/图片水印/等比例缩略图/实现代码
2010/05/15 PHP
js中的值类型和引用类型小结 文字说明与实例
2010/12/12 Javascript
js移除事件 js绑定事件实例应用
2012/11/28 Javascript
jQuery实现点击文本框弹出热门标签的提示效果
2013/11/17 Javascript
删除javascript中注释语句的正则表达式
2014/06/11 Javascript
js数组的基本操作(很全自己整理的)
2014/10/16 Javascript
js随机生成字母数字组合的字符串 随机动画数字
2015/09/02 Javascript
js判断鼠标位置是否在某个div中的方法
2016/02/26 Javascript
基于jQuery实现文字打印动态效果
2017/04/21 jQuery
详解Node.js开发中的express-session
2017/05/19 Javascript
详解node child_process模块学习笔记
2018/01/24 Javascript
jquery radio 动态控制选中失效问题的解决方法
2018/02/28 jQuery
vue路由守卫+登录态管理实例分析
2019/05/21 Javascript
vue elementUI table 自定义表头和行合并的实例代码
2019/05/22 Javascript
JS图片懒加载的优点及实现原理
2020/01/10 Javascript
vue radio单选框,获取当前项(每一项)的value值操作
2020/09/10 Javascript
vue使用require.context实现动态注册路由
2020/12/25 Vue.js
Python中生成器和yield语句的用法详解
2015/04/17 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
利用anaconda保证64位和32位的python共存
2021/03/09 Python
Django模板导入母版继承和自定义返回Html片段过程解析
2019/09/18 Python
python GUI库图形界面开发之PyQt5表单布局控件QFormLayout详细使用方法与实例
2020/03/06 Python
如何查看Django ORM执行的SQL语句的实现
2020/04/20 Python
澳大利亚领先的在线美容商城:Adore Beauty
2017/04/14 全球购物
科颜氏印度官网:Kiehl’s印度
2021/02/20 全球购物
实习教师自我鉴定
2013/12/12 职场文书
会计专业毕业生自荐信范文
2013/12/20 职场文书
餐饮企业总经理岗位职责范文
2014/02/18 职场文书
亲子读书活动方案
2014/02/22 职场文书
篮球比赛口号
2014/06/10 职场文书
幼儿园感恩节活动方案2014
2014/10/11 职场文书
解除同居协议书
2015/01/29 职场文书
2015年助残日活动总结
2015/03/27 职场文书
预备党员转正党小组意见
2015/06/01 职场文书
导游词之重庆钓鱼城
2019/09/19 职场文书
Redis Cluster 字段模糊匹配及删除
2021/05/27 Redis