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 动态随机生成验证码类代码
Apr 09 PHP
PHP下获取上个月、下个月、本月的日期(strtotime,date)
Feb 02 PHP
兼容PHP和Java的des加密解密代码分享
Jun 26 PHP
PHP之uniqid()函数用法
Nov 03 PHP
在SAE上搭建最新wordpress的方法
Dec 21 PHP
关于URL最大长度限制的相关资料查证
Dec 23 PHP
PHP技术开发微信公众平台
Jul 22 PHP
PHP读取配置文件类实例(可读取ini,yaml,xml等)
Jul 28 PHP
PHP实现基于文本的摩斯电码生成器
Jan 11 PHP
基于jQueryUI和Corethink实现百度的搜索提示功能
Nov 09 PHP
PHP实现下载远程图片保存到本地的方法
Jun 19 PHP
PHP实现 APP端微信支付功能
Jun 22 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导出oracle库的php代码
2009/04/20 PHP
PHP句法规则详解 入门学习
2011/11/09 PHP
php的mkdir()函数创建文件夹比较安全的权限设置方法
2014/07/28 PHP
深入理解PHP内核(一)
2015/11/10 PHP
php获取POST数据的三种方法实例详解
2016/12/20 PHP
js中格式化日期时间型数据函数代码
2010/11/08 Javascript
JavaScript实现页面跳转的几种常用方式
2015/11/28 Javascript
AngularJS+Bootstrap实现多文件上传与管理
2016/11/08 Javascript
原生JS获取元素集合的子元素宽度实例
2016/12/14 Javascript
总结4个方面优化Vue项目
2019/02/11 Javascript
viewer.js实现图片预览功能
2020/06/24 Javascript
vue 路由缓存 路由嵌套 路由守卫 监听物理返回操作
2020/08/06 Javascript
Python isinstance判断对象类型
2008/09/06 Python
python实现无证书加密解密实例
2014/10/27 Python
Python进程间通信Queue实例解析
2018/01/25 Python
Python闭包之返回函数的函数用法示例
2018/01/27 Python
python实现自动解数独小程序
2019/01/21 Python
Django CBV类的用法详解
2019/07/26 Python
python可视化篇之流式数据监控的实现
2019/08/07 Python
python tkinter组件摆放方式详解
2019/09/16 Python
pytorch获取模型某一层参数名及参数值方式
2019/12/30 Python
SISLEY希思黎官方旗舰店:享誉全球的奢华植物美容品牌
2018/04/25 全球购物
印度排名第一的蛋糕、鲜花和礼品送货:Winni
2019/08/02 全球购物
Craghoppers德国官网:户外和旅行服装
2020/02/14 全球购物
经典C++面试题一
2016/11/06 面试题
医学生自荐信范文
2013/12/03 职场文书
本科毕业生专业自荐书范文
2014/02/05 职场文书
优秀会计求职信
2014/07/04 职场文书
求职意向书
2014/07/29 职场文书
个人委托书
2014/07/31 职场文书
大学生简历自我评价2015
2015/03/03 职场文书
业务员岗位职责范本
2015/04/03 职场文书
红白喜事主持词
2015/07/06 职场文书
vue Element-ui表格实现树形结构表格
2021/06/07 Vue.js
mybatis中sql语句CDATA标签的用法说明
2021/06/30 Java/Android
5种方法告诉你如何使JavaScript 代码库更干净
2021/09/15 Javascript