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 相关文章推荐
Apache设置虚拟WEB
Oct 09 PHP
聊天室php&mysql(一)
Oct 09 PHP
兼容firefox,chrome的网页灰度效果
Aug 08 PHP
php 在windows下配置虚拟目录的方法介绍
Jun 26 PHP
codeigniter教程之多文件上传使用示例
Feb 11 PHP
分享一段php获取linux服务器状态的代码
May 27 PHP
php文件压缩之PHPZip类用法实例
Jun 18 PHP
PHP中的Session对象如何使用
Sep 25 PHP
PHP数组操作简单案例分析
Oct 15 PHP
用PHP将Unicode 转化为UTF-8的实现方法(推荐)
Feb 08 PHP
PHP简单实现正则匹配省市区的方法
Apr 13 PHP
PHP设计模式(一)工厂模式Factory实例详解【创建型】
May 02 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去除数组中重复的元素并按键名排序函数
2008/08/18 PHP
php在页面中调用fckeditor编辑器的方法
2011/06/10 PHP
PHP校验15位和18位身份证号的类封装
2018/11/07 PHP
动态标签 悬停效果 延迟加载示例代码
2013/11/21 Javascript
jQuery使用post方法提交数据实例
2015/03/25 Javascript
jQuery插件slider实现拖动滑块选取价格范围
2015/04/30 Javascript
jQuery用FormData实现文件上传的方法
2016/11/21 Javascript
Angular.JS判断复选框checkbox是否选中并实时显示
2016/11/30 Javascript
Javascript封装id、class与元素选择器方法示例
2017/03/13 Javascript
解决vue中使用swiper插件问题及swiper在vue中的用法
2018/04/04 Javascript
Vue.js 中取得后台原生HTML字符串 原样显示问题的解决方法
2018/06/10 Javascript
使用jquery模拟a标签的click事件无法实现跳转的解决
2018/12/04 jQuery
命令行批量截图Node脚本示例代码
2019/01/25 Javascript
bootstrap table列和表头对不齐的解决方法
2019/07/19 Javascript
nodejs文件夹深层复制功能
2019/09/03 NodeJs
浅谈vuex为什么不建议在action中修改state
2020/02/02 Javascript
javascript-hashchange事件和历史状态管理实例分析
2020/04/18 Javascript
微信小程序中使用 async/await的方法实例分析
2020/05/06 Javascript
vue中el-input绑定键盘按键(按键修饰符)
2020/07/22 Javascript
javascript的hashCode函数实现代码小结
2020/08/11 Javascript
如何利用JS将手机号中间四位变成*号
2020/09/29 Javascript
[59:00]DOTA2-DPC中国联赛 正赛 Ehome vs PSG.LGD BO3 第一场 3月7日
2021/03/11 DOTA
python中print的不换行即时输出的快速解决方法
2016/07/20 Python
Python文件操作基本流程代码实例
2017/12/11 Python
PyQt5内嵌浏览器注入JavaScript脚本实现自动化操作的代码实例
2019/02/13 Python
CSS3教程:边框属性border的极致应用
2009/04/02 HTML / CSS
法国时尚品牌乐都特瑞士站:La Redoute瑞士
2016/09/05 全球购物
Mixbook加拿大:照片书,照片卡,剪贴簿,年历和日历
2017/02/21 全球购物
土木工程毕业生推荐信
2013/10/28 职场文书
销售演讲稿范文
2014/01/08 职场文书
洗发露广告词
2014/03/14 职场文书
最新离婚协议书范本
2014/08/19 职场文书
三严三实对照检查材料范文
2014/09/23 职场文书
Css预编语言及区别详解
2021/04/25 HTML / CSS
关于CentOS 8 搭建MongoDB4.4分片集群的问题
2021/10/24 MongoDB
JS精髓原型链继承及构造函数继承问题纠正
2022/06/16 Javascript