ThinkPHP 集成 jwt 技术 token 验证

ThinkPHP 集成 jwt 技术 token 验证

  • 一、思路流程
  • 二、安装 firebase/php-jwt
  • 三、封装token类
  • 四、创建中间件,检验Token校验时效性
  • 五、配置路由中间件
  • 六、写几个测试方法,通过postman去验证

一、思路流程

  1. 客户端使用用户名和密码请求登录
  2. 服务端收到请求,验证用户名和密码
  3. 验证成功后,服务端会签发一个token,再把这个token返回给客户端
  4. 客户端收到token后可以把它存储起来,比如放到cookie中
  5. 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
  6. 服务端收到请求,然后去验证客户端请求里面带着的token,如果验证成功,就向客户端返回请求数据

二、安装 firebase/php-jwt

composer require firebase/php-jwt

三、封装token类

因为我这个是多应用,然后我就只在index应用(只提供api接口)下设置了token类

在这里插入图片描述

<?php
namespace app\index\server;use Firebase\JWT\JWT;
use Firebase\JWT\Key;class Token
{protected $key;public function __construct(){//从配置信息这种或取唯一字符串,你可以随便写比如md5('token')$this->key = 'adcdefg';}/*** 生成token* @param $uid* @return mixed*/function generateToken($uid){//获取当前时间戳$currentTime = time();$data = array("iss" => $this->key,        //签发者 可以为空"aud" => '',             //面象的用户,可以为空"iat" => $currentTime,   //签发时间"nbf" => $currentTime,   //立马生效"exp" => $currentTime + 7200, //token 过期时间 两小时"data" => [              //记录的userid的信息,这里是自已添加上去的,如果有其它信息,可以再添加数组的键值对'uid' => $uid,]);//生成token$token = JWT::encode($data, $this->key, "HS256");  //根据参数生成了 tokenreturn $token;}/*** 校验token时效性*/public function chekToken($token){$status=array("code"=>2);try {JWT::$leeway = 60;//当前时间减去60,把时间留点余地$decoded = JWT::decode($token,new Key($this->key,'HS256')); //HS256方式,这里要和签发的时候对应$arr = (array)$decoded;$res['code']=1;$res['data']=$arr['data'];return $res;} catch(\Firebase\JWT\SignatureInvalidException $e) { //签名不正确$status['msg']="签名不正确";return $status;}catch(\Firebase\JWT\BeforeValidException $e) { // 签名在某个时间点之后才能用$status['msg']="token失效";return $status;}catch(\Firebase\JWT\ExpiredException $e) { // token过期$status['msg']="token失效";return $status;}catch(\Exception $e) { //其他错误$status['msg']="未知错误";return $status;}}}

四、创建中间件,检验Token校验时效性

创建中间件命令:

php think make:middleware CheckToken

在这里插入图片描述

<?php
declare (strict_types = 1);namespace app\middleware;class CheckToken
{/*** 处理请求 token 验证** @param \think\Request $request* @param \Closure       $next* @return Response*/public function handle($request, \Closure $next){//第一步先取token$token = $request->header('token');//jwt进行校验token$res = (new TokenServer())->chekToken($token);if ($res['code'] != 1 ){return json(['error_code'=>999,'msg'=>$res['msg'],'data'=>''],400);}$request->uid = $res['data']->uid;return $next($request);}
}

五、配置路由中间件

在config/middleware.php中注册中间件

在这里插入图片描述

<?php
// 中间件配置
return [// 别名或分组'alias'    => [// 注册中间件'check' => [app\middleware\CheckToken::class],],// 优先级设置,此数组中的中间件会按照数组中的顺序优先执行'priority' => [],
];

在app/api/route/route.php路由文件中进行使用,进行使用中间件校验token

在这里插入图片描述

<?php
use think\facade\Route;
// restfull 资源路由
Route::resource('a', 'TestR');// 路由分组
Route::group('a',function (){})->middleware('check');

六、写几个测试方法,通过postman去验证

<?php
declare (strict_types = 1);namespace app\index\controller;use app\index\server\Token as TokenServer;
use think\Request;use think\annotation\route\Resource;// 资源控制器
/*** @Resource("a")*/
class TestR
{/*** 显示资源列表** @return \think\Response*/public function index(Request $request){// 假定用户名为robin和密码为123456即为正确的账号if($request->param('uname') == 'robin'&& $request->param('upwd')=='123456'){$uid = $request->param('uname');// 设置token$token = (new TokenServer())->generateToken($uid);$data = ['name' => 'thinkphp', 'status' => '1','token'=>$token];// 给前端返回json字符串,同时前端将token获取并且存入到以后的所有操作中return show(config("status.success"),"请求成功",$data);}else{return show(config("status.error"),"用户名密码错误",null);}}/*** 保存新建的资源** @param  \think\Request  $request* @return \think\Response*/public function save(Request $request){// 用update 来验证一下token$token = $request->param('token');$rs = checkToken($token);return json($rs);}// ....
}
  1. 模拟登录测试

在这里插入图片描述

  1. 模拟前端携带token参数访问
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/60385.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读 FCOS: Fully Convolutional One-Stage Object Detection

文章目录 FCOS: Fully Convolutional One-Stage Object DetectionAbstract1. Introduction2. Related Work3. Our Approach3.1. Fully Convolutional One-Stage Object Detector3.2. Multi-level Prediction with FPN for FCOS3.3. Center-ness for FCOS 4. Experiments4.1. Ab…

字符串匹配的Rabin–Karp算法

leetcode-28 实现strStr() 更熟悉的字符串匹配算法可能是KMP算法, 但在Golang中,使用的是Rabin–Karp算法 一般中文译作 拉宾-卡普算法,由迈克尔拉宾与理查德卡普于1987年提出 “ 要在一段文本中找出单个模式串的一个匹配&#xff0c;此算法具有线性时间的平均复杂度&#xff0…

【LeetCode-中等题】230. 二叉搜索树中第K小的元素

文章目录 题目方法一&#xff1a;层序遍历 集合排序方法二&#xff1a;中序遍历&#xff08;栈 或者 递归 &#xff09;方法三&#xff08;方法二改进&#xff09;&#xff1a;中序遍历&#xff08;栈 &#xff09; 题目 该题最大的特点就是这个树是二叉树&#xff1a; 所以…

【java中的Set集合】HashSet、LinkedHashSet、TreeSet(最通俗易懂版!!)

目录 一、HashSet集合 1.HashSet集合的特点 2.HashSet常用方法 二、LinkedHashSet集合 LinkedHashSet集合的特点 三、TreeSet集合 1.TreeSet集合的特点 2.TreeSet的基本使用 四、HashSet、LinkedHashSet、TreeSet的使用场景 五、list和set集合的区别 一、HashSet集合 …

网页接口导入postman进行接口请求

postman版本&#xff1a;v10.17.4 一、拷贝接口信息 网页打开开发者工具-networkk&#xff0c;在网页上请求一次接口&#xff0c;鼠标指在接口上&#xff0c;点击鼠标右键-copy-copy as cURL(bash) 二、导入postman 打开postman&#xff0c;点击import-Raw text&#xff0c;…

YOLOv5、YOLOv7 注意力机制改进SEAM、MultiSEAM、TripletAttention

用于学习记录 文章目录 前言一、SEAM、MultiSEAM1.1 models/common.py1.2 models/yolo.py1.3 models/SEAM.yaml1.4 models/MultiSEAM.yaml1.5 SEAM 训练结果图1.6 MultiSEAM 训练结果图二、TripletAttention2.1 models/common.py2.2 models/yolo.py2.3 yolov7/cfg/training/Tri…

Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421

文章目录 0.前言1.参考文档2.基础介绍3.漏洞利用原理3.解决方案1. 升级Spring Boot版本2. 限制端点的访问3. 禁用环境端点4. 不公开敏感的Actuator端点5. 开启安全审计 0.前言 背景&#xff1a; Spring Boot Actuator的Env端点存在本地文件包含(LFI)漏洞CVE-2020-5421。被扫描到…

【C51基础实验 LED闪烁】

51单片机项目基础篇 LED闪烁1、硬件电路设计和原理分析2、软件设计2.1、功能实现&#xff1a;LED闪烁2.2、通过 KEIL 软件自带仿真查看延时时间 4、编译结果5、结束语 LED闪烁 前言&#xff1a; 前一篇学会了点亮一颗LED以及驱动原理&#xff0c;那么这篇紧接着就来解锁LED的新…

【业务功能篇90】微服务-springcloud-检索服务-ElasticSearch实战运用-DSL语句

商城检索服务 1.检索页面的搭建 商品检索页面我们放在search服务中处理&#xff0c;首页我们需要在mall-search服务中支持Thymeleaf。添加对应的依赖 <!-- 添加Thymeleaf的依赖 --><dependency><groupId>org.springframework.boot</groupId><artifa…

(笔记二)利用opencv调用鼠标事件在图像上绘制图形

目录 &#xff08;1&#xff09;查看cv2所支持的鼠标事件&#xff08;2&#xff09;通过鼠标事件在图像上做标记&#xff08;3&#xff09;高级操作&#xff1a;通过移动鼠标在图像绘制图形、曲线 该功能主要创建一个鼠标事件发生时执行的回调函数。鼠标事件可以是任何与鼠标有…

根据身高重建队列【贪心算法】

根据身高重建队列 假设有打乱顺序的一群人站成一个队列&#xff0c;数组 people 表示队列中一些人的属性&#xff08;不一定按顺序&#xff09;。每个 people[i] [hi, ki] 表示第 i 个人的身高为 hi &#xff0c;前面 正好 有 ki 个身高大于或等于 hi 的人。 请你重新构造并返…

SQL注入漏洞复现(CVE-2017-8917)

文章目录 搭建环境启动环境漏洞复现报错注入使用sqlmap 前提条件&#xff1a; 1.安装docker docker pull medicean/vulapps:j_joomla_22.安装docker-compose docker run -d -p 8000:80 medicean/vulapps:j_joomla_23.下载vulhub Docker Compose是 docker 提供的一个命令行工具&…

Mysql中九种索引失效场景分析

表数据&#xff1a; 索引情况&#xff1a; 其中a是主键&#xff0c;对应主键索引&#xff0c;bcd三个字段组成联合索引&#xff0c;e字段为一个索引 情况一&#xff1a;不符合最左匹配原则 去掉b1的条件后就不符合最左匹配原则了&#xff0c;导致索引失效 情况二&#xff…

go学习-指针 标识符

指针&#xff0c;以及标识符 1.指针 &#xff08;1&#xff09;.基本介绍 1&#xff09;基本数据类型&#xff0c;变量存的值&#xff0c;也叫值类型 2&#xff09;获取变量的地址用&&#xff0c;比如 var num int ,获取num的地址&#xff1a;&num 3)指针类型&…

小程序隐私保护授权处理方式之弹窗组件

欢迎点击关注-前端面试进阶指南&#xff1a;前端登顶之巅-最全面的前端知识点梳理总结 *分享一个使用比较久的&#x1fa9c; 小程序隐私保护授权弹窗组件 调用wx.getUserProfile进行授权时&#xff0c;返回错误信息&#xff1a;{errMsg: “getUserProfile:fail api scope is…

智慧排水监测系统:创新监测技术保障排水系统安全运行

城市排水系统作为城市基础设施的重要组成部分&#xff0c;其安全运行直接关系到环境卫生、居民生活和城市发展。为了确保排水系统的顺畅运行&#xff0c;传统的监测手段已经不能满足日益复杂的城市排水需求&#xff0c;物联网技术的快速发展为排水系统的监测带来了巨大的便利&a…

科普宣传片制作思路

科普宣传片可以针对不同的科学领域和主题&#xff0c;包括自然科学、生命科学、物理学、化学、天文学、地球科学、环境保护等&#xff0c;提供具体的案例、实验和研究成果&#xff0c;帮助观众更好地理解和应用科学知识。科普宣传片的制作思路可以根据具体的科普主题和目标观众…

基于ssm vue智慧城市实验室主页系统源码和论文

基于ssm vue智慧城市实验室主页系统源码和论文059 开发工具&#xff1a;idea 数据库mysql5.7 数据库链接工具&#xff1a;navcat,小海豚等 技术&#xff1a;ssm 摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方…

基于协同滤波推荐算法的图书管理系统

目录 一、项目概述 二、技术框架 三、功能设计 四、数据库设计 五、项目截图 六、技术文档 一、项目概述 Hi&#xff0c;大家好&#xff0c;今天分享的项目是《基于协同滤波推荐算法的图书管理系统》&#xff0c;对用户登录注册、图书推荐、图书管理、用户信息进行管理&…

Vue3响应式原理 私

响应式的本质&#xff1a;当数据变化后会自动执行某个函数映射到组件&#xff0c;自动触发组件的重新渲染。 响应式的实现方式就是劫持数据&#xff0c;Vue3的reactive就是通过Proxy劫持数据&#xff0c;由于劫持的是整个对象&#xff0c;所以可以检测到任何对象的修改&#xf…