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 smarty模版引擎中的缓存应用
Dec 02 PHP
php中jQuery插件autocomplate的简单使用笔记
Jun 14 PHP
强烈声明: 不要使用(include/require)_once
Jun 06 PHP
Laravel 5 框架入门(一)
Apr 09 PHP
PHP通过API获取手机号码归属地
May 28 PHP
解决ThinkPHP下使用上传插件Uploadify浏览器firefox报302错误的方法
Dec 18 PHP
PHP解压tar.gz格式文件的方法
Feb 14 PHP
PHP+原生态ajax实现的省市联动功能详解
Aug 15 PHP
PHP的PDO预定义常量讲解
Jan 24 PHP
laravel框架中控制器的创建和使用方法分析
Nov 23 PHP
Thinkphp5框架中引入Markdown编辑器操作示例
Jun 03 PHP
PHP实现简单的计算器
Aug 28 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设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
PHP面向对象的进阶学习(抽像类、接口、final、类常量)
2012/05/07 PHP
解析关于wamp启动是80端口被占用的问题
2013/06/21 PHP
thinkPHP框架实现图像裁剪、缩放、加水印的方法
2017/03/14 PHP
Laravel框架实现定时Task Scheduling例子
2019/10/22 PHP
Javascript 网页黑白效果实现代码(兼容IE/FF等)
2010/04/23 Javascript
基于Jquery的仿照flash放大图片效果代码
2011/03/16 Javascript
Javascript表格翻页效果实现思路及代码
2013/08/23 Javascript
实例说明为什么不要行内使用javascript
2014/04/18 Javascript
nodejs教程之制作一个简单的文章发布系统
2014/11/21 NodeJs
JQuery实现带排序功能的权限选择实例
2015/05/18 Javascript
基于jQuery实现响应式圆形图片轮播特效
2015/11/25 Javascript
继续学习javascript闭包
2015/12/03 Javascript
jquery中cookie用法实例详解(获取,存储,删除等)
2016/01/04 Javascript
基于javascript bootstrap实现生日日期联动选择
2016/04/07 Javascript
详解angularjs 关于ui-router分层使用
2017/06/12 Javascript
node.js操作MongoDB的实例详解
2017/10/11 Javascript
详解如何使用node.js的开发框架express创建一个web应用
2018/12/20 Javascript
使用vue开发移动端管理后台的注意事项
2019/03/07 Javascript
[01:43]3.19DOTA2发布会 三代刀塔人第三代
2014/03/25 DOTA
Python内置的字符串处理函数详细整理(覆盖日常所用)
2014/08/19 Python
Python命令启动Web服务器实例详解
2017/02/23 Python
Python实现统计代码行的方法分析
2017/07/12 Python
pandas 使用apply同时处理两列数据的方法
2018/04/20 Python
Python合并多个Excel数据的方法
2018/07/16 Python
Python API 自动化实战详解(纯代码)
2019/06/11 Python
python requests.get带header
2020/05/05 Python
ROSEFIELD手表荷兰官方网上商店:北欧极简设计女士腕表品牌
2018/01/24 全球购物
FLIR美国官网:热成像, 夜视和红外摄像系统
2018/07/13 全球购物
小学班级口号
2014/06/09 职场文书
拉拉队口号
2014/06/16 职场文书
幼儿园八一建军节活动方案
2014/08/27 职场文书
无财产无子女离婚协议书范文
2014/09/14 职场文书
党的群众路线教育实践活动个人整改措施范文
2014/11/04 职场文书
幼儿园大班开学寄语(2015秋季)
2015/05/27 职场文书
数据结构课程设计心得体会
2016/01/15 职场文书