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缩略图生成程式(需要GD库支持)
Mar 06 PHP
Discuz 5.0 中读取纯真IP数据库函数分析
Mar 16 PHP
Mysql和网页显示乱码解决方法集锦
Mar 27 PHP
Blitz templates 最快的PHP模板引擎
Apr 06 PHP
使用php 获取时间今天明天昨天时间戳的详解
Jun 20 PHP
php递归函数中使用return的注意事项
Jan 17 PHP
php去除字符串换行符示例分享
Feb 13 PHP
一个简单的PHP验证码实现代码
May 10 PHP
CI框架Session.php源码分析
Nov 03 PHP
php实现网站顶踩功能的完整前端代码
Jul 19 PHP
基于CI(CodeIgniter)框架实现购物车功能的方法
Apr 09 PHP
Laravel的加密解密与哈希实例讲解
Mar 24 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实现多服务器session共享之NFS共享的方法
2007/03/16 PHP
PHP 身份验证方面的函数
2009/10/11 PHP
php截取后台登陆密码的代码
2012/05/05 PHP
基于php的CMS中展示文章类实例分析
2015/06/18 PHP
编写PHP脚本来实现WordPress中评论分页的功能
2015/12/10 PHP
PHP简单实现正则匹配省市区的方法
2018/04/13 PHP
基于jquery自己写tab滑动门(通用版)
2012/10/30 Javascript
$.getJSON在IE下失效的原因分析及解决方法
2013/06/16 Javascript
在服务端(Page.Write)调用自定义的JS方法详解
2013/08/09 Javascript
JS操作JSON要领详细总结
2013/08/25 Javascript
fmt:formatDate的输出格式详解
2014/01/09 Javascript
JS组件Bootstrap Table使用方法详解
2016/02/02 Javascript
AngularJs表单验证实例详解
2016/05/30 Javascript
详解js树形控件—zTree使用总结
2016/12/28 Javascript
JS实现图片点击后出现模态框效果
2017/05/03 Javascript
vue实现未登录跳转到登录页面的方法
2018/07/17 Javascript
vue中子组件的methods中获取到props中的值方法
2018/08/27 Javascript
Javascript的this详解
2019/03/23 Javascript
微信小程序如何播放腾讯视频的实现
2019/09/20 Javascript
js实现抽奖功能
2020/11/24 Javascript
[02:43]中国五虎出征TI3视频
2013/08/02 DOTA
Python中的pass语句使用方法讲解
2015/05/14 Python
PyQt 线程类 QThread使用详解
2017/07/16 Python
python中时间模块的基本使用教程
2019/05/14 Python
Python生命游戏实现原理及过程解析(附源代码)
2019/08/01 Python
flask实现验证码并验证功能
2019/12/05 Python
Python range与enumerate函数区别解析
2020/02/28 Python
Python reversed函数及使用方法解析
2020/03/17 Python
Python实现AES加密,解密的两种方法
2020/10/03 Python
中国电子产品外贸网站:MiniIntheBox
2017/02/06 全球购物
戴尔英国官网:Dell英国
2017/05/27 全球购物
手工制作的音乐盒:Music Box Attic
2019/09/05 全球购物
员工培训邀请函
2014/01/11 职场文书
卫生安全检查制度
2014/02/04 职场文书
水电施工员岗位职责
2015/04/11 职场文书
运动会闭幕式主持词
2015/07/01 职场文书