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调用三种数据库的方法(3)
Oct 09 PHP
php mysql数据库操作分页类
Jun 04 PHP
优化PHP程序的方法小结
Feb 23 PHP
PHP读取xml方法介绍
Jan 12 PHP
ini_set的用法介绍
Jan 07 PHP
php检测用户是否用手机(Mobile)访问网站的类
Jan 09 PHP
PHP把小数转成整数3种方法
Jun 30 PHP
图文详解PHP环境搭建教程
Jul 16 PHP
基于PHP实现短信验证码接口(容联运通讯)
Sep 06 PHP
Laravel 的数据库迁移的方法
Jul 31 PHP
Yii框架应用组件用法实例分析
May 15 PHP
php与阿里云短信接口接入操作案例分析
May 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
MySQL数据源表结构图示
2008/06/05 PHP
php 字符串函数收集
2010/03/29 PHP
PHP中通过语义URL防止网站被攻击的方法分享
2011/09/08 PHP
thinkphp路由规则使用示例详解和伪静态功能实现(apache重写)
2014/02/24 PHP
PHP.ini安全配置检测工具pcc简单介绍
2015/07/02 PHP
PHP中filter函数校验数据的方法详解
2015/07/31 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
基于PHP的微信公众号的开发流程详解
2020/08/07 PHP
用javascript连接access数据库的方法
2006/11/17 Javascript
jQuery 技巧大全(新手入门篇)
2009/05/12 Javascript
使用jquery解析XML示例代码
2014/09/05 Javascript
JQuery实现展开关闭层的方法
2015/02/17 Javascript
初步认识JavaScript函数库jQuery
2015/06/18 Javascript
基于HTML+CSS,jQuery编写的简易计算器后续(添加了键盘监听)
2016/01/05 Javascript
jQuery实现滚动鼠标放大缩小图片的方法(附demo源码下载)
2016/03/05 Javascript
JavaScript学习笔记--常用的互动方法
2016/12/07 Javascript
详解vue-router 初始化时做了什么
2018/06/11 Javascript
vue自定义标签和单页面多路由的实现代码
2020/05/03 Javascript
[02:08]DOTA2英雄基础教程 马格纳斯
2014/01/17 DOTA
简单介绍Python中的floor()方法
2015/05/15 Python
Python中处理字符串之isalpha()方法的使用
2015/05/18 Python
解决python2.7 查询mysql时出现中文乱码
2016/10/09 Python
用十张图详解TensorFlow数据读取机制(附代码)
2018/02/06 Python
用Python将结果保存为xlsx的方法
2019/01/28 Python
计算机二级python学习教程(2) python语言基本语法元素
2019/05/16 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
TensorFlow MNIST手写数据集的实现方法
2020/02/05 Python
python3 配置logging日志类的操作
2020/04/08 Python
CSS3美化表单控件全集
2016/06/29 HTML / CSS
CSS3属性box-shadow使用详细教程
2012/01/21 HTML / CSS
Bodum官网:咖啡和茶壶、玻璃器皿、厨房电器等
2018/08/01 全球购物
数控技术专业毕业自荐书范文
2014/02/05 职场文书
名企HR怎样看待求职信
2014/02/23 职场文书
个人作风建设心得体会
2014/10/22 职场文书
社区扶贫帮困工作总结
2015/05/20 职场文书
MySQL 原理与优化之Limit 查询优化
2022/08/14 MySQL