ThinkPHP 集成 jwt 技术 token 验证
ThinkPHP 集成 jwt 技术 token 验证
- 一、思路流程
- 二、安装 firebase/php-jwt
- 三、封装token类
- 四、创建中间件,检验Token校验时效性
- 五、配置路由中间件
- 六、写几个测试方法,通过postman去验证
一、思路流程
- 客户端使用用户名和密码请求登录
- 服务端收到请求,验证用户名和密码
- 验证成功后,服务端会签发一个token,再把这个token返回给客户端
- 客户端收到token后可以把它存储起来,比如放到cookie中
- 客户端每次向服务端请求资源时需要携带服务端签发的token,可以在cookie或者header中携带
- 服务端收到请求,然后去验证客户端请求里面带着的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);}// ....
}
- 模拟登录测试

- 模拟前端携带token参数访问

相关文章:
ThinkPHP 集成 jwt 技术 token 验证
ThinkPHP 集成 jwt 技术 token 验证 一、思路流程二、安装 firebase/php-jwt三、封装token类四、创建中间件,检验Token校验时效性五、配置路由中间件六、写几个测试方法,通过postman去验证 一、思路流程 客户端使用用户名和密码请求登录服务端收到请求&…...
gerrit 如何提交进行review
前言 本文主要介绍如何使用gerrit进行review。 下述所有流程都是参考: https://gerrit-review.googlesource.com/Documentation/intro-gerrit-walkthrough.html 先给一个commit后但是还没有push上去的一个办法: git reset --hard HEAD^可以多次reset.…...
罗勇军 →《算法竞赛·快冲300题》每日一题:“游泳” ← DFS+剪枝
【题目来源】http://oj.ecustacm.cn/problem.php?id1753http://oj.ecustacm.cn/viewnews.php?id1023【题目描述】 游泳池可以等分为n行n列的小区域,每个区域的温度不同。 小明现在在要从游泳池的左上角(1, 1)游到右下角(n, n),小明只能向上下左右四个方…...
【教程】PyTorch Timer计时器
转载请注明出处:小锋学长生活大爆炸[xfxuezhang.cn] OpenCV的Timer计时器可以看这篇:Python Timer和TimerFPS计时工具类 Timer作用说明:统计某一段代码的运行耗时。 直接上代码,开箱即用。 import time import torch import os …...
因果推断(六)基于微软框架dowhy的因果推断
因果推断(六)基于微软框架dowhy的因果推断 DoWhy 基于因果推断的两大框架构建:「图模型」与「潜在结果模型」。具体来说,其使用基于图的准则与 do-积分来对假设进行建模并识别出非参数化的因果效应;而在估计阶段则主要…...
探索隧道ip如何助力爬虫应用
在数据驱动的世界中,网络爬虫已成为获取大量信息的重要工具。然而,爬虫在抓取数据时可能会遇到一些挑战,如IP封禁、访问限制等。隧道ip(TunnelingProxy)作为一种强大的解决方案,可以帮助爬虫应用更高效地获…...
题目:2629.复合函数
题目来源: leetcode题目,网址:2629. 复合函数 - 力扣(LeetCode) 解题思路: 倒序遍历计算。 解题代码: /*** param {Function[]} functions* return {Function}*/ var compose function(…...
【实训项目】精点考研
1.设计摘要 如果说高考是一次能够改变命运的考试,那么考研应该是另外一次。为什么那么多人都要考研呢?从中国教育在线官方公布是考研动机调查来看,大家扎堆考研的原因大概集中在这6个方面:本科就业压力大,提升竞争力、…...
软件测试Pytest实现接口自动化应该如何在用例执行后打印日志到日志目录生成日志文件?
Pytest可以使用内置的logging模块来实现接口自动化测试用例执行后打印日志到日志目录以生成日志文件。以下是实现步骤: 1、在pytest配置文件(conftest.py)中,定义一个日志输出路径,并设置logging模块。 import loggi…...
深入理解作用域、作用域链和闭包
🎬 岸边的风:个人主页 🔥 个人专栏 :《 VUE 》 《 javaScript 》 ⛺️ 生活的理想,就是为了理想的生活 ! 目录 📚 前言 📘 1. 词法作用域 📖 1.2 示例 📖 1.3 词法作用域的…...
7款适合3D建模和渲染的GPU推荐
选择一款完美的 GPU 并不是一件容易的事;您不仅必须确保有特定数量的线程和内核来处理图像,而且还应该有足够的 RAM。 这是因为 3D 渲染是一个活跃的工作过程,因为您必须坐在 PC 前并持续与软件交互。为了在 3D 场景中积极工作,您…...
边缘计算物联网网关在机械加工行业的应用及作用分享
随着工业4.0的推进,物联网技术正在逐渐渗透到各个行业领域。机械加工行业作为制造业的基础领域之一,其生产过程的自动化、智能化水平直接影响到产品质量和生产效率。边缘计算物联网网关作为物联网技术的重要组成部分,在机械加工行业中发挥着越…...
(笔记六)利用opencv进行图像滤波
(1)自定义卷积核图像滤波 import numpy as np import matplotlib.pyplot as plt import cv2 as cvimg_path r"D:\data\test6-6.png" img cv.imread(img_path)# 图像滤波 ker np.ones((6, 6), np.float32)/36 # 构建滤波器(卷积…...
WPF C# .NET7 基础学习
学习视频地址:https://www.bilibili.com/video/BV1hx4y1G7C6?p3&vd_source986db470823ebc16fe0b3d235addf050 开发工具:Visual Studio 2022 Community 基础框架:.Net 6.0 下载创建过程略 .Net和.Framework 区别是Net是依赖项ÿ…...
QT里使用sqlite的问题,好多坑
1. 我使用sqlite,开发机上好好的,测试机上却不行。后来发现是缺少驱动(Driver not loaded Driver not loaded),代码检查了又检查,发现应该是缺少dll文件(系统不提示,是自己使用 QMes…...
openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍
文章目录 openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍59.1 数据库59.2 表空间59.3 模式59.4 用户和角色59.5 事务管理 openGauss学习笔记-59 openGauss 数据库管理-相关概念介绍 59.1 数据库 数据库用于管理各类数据对象,与其他数据库隔离。创建数据…...
Nginx安装与部署
文章目录 一,说明二,下载三,Windows下安装1,安装2,启动3,验证 四,Linux下安装1,安装2,启动3,验证 五,Nginx配置 一,说明 Nginx是一款高性能Web和反向代理服务器,提供内存少,高并发,负载均衡和反向代理服务,支持windos和linux系统 二,下载 打开浏览器,输入地址: https://ngin…...
Linux中Tomcat发布war包后无法正常访问非静态资源
事故现象 在CentOS8中安装完WEB环境,首次部署WEB项目DEMO案例,发现可以静态的网页内容, 但是无法向后台发送异步请求,全部出现404问题,导致数据库数据无法渲染到界面上。 原因分析 CentOS请求中提示用来获取资源的连…...
大数据、AI和云原生:引领未来软件开发的技术演进
文章目录 **1. 数据驱动的创新:****2. 智能化应用的兴起:****3. 云原生的敏捷和可扩展性:****4. 实时性和即时性:****5. 数据隐私和安全:****6. 跨平台和跨设备:****7. 自动化和智能编程:****8.…...
Text-to-SQL小白入门(四)指令进化大模型WizardLM
摘要 本文主要对大模型WizardLM的基本信息进行了简单介绍,展示了WizardLM取得的优秀性能,分析了论文的核心——指令进化方法。 论文概述 基本信息 英文标题:WizardLM: Empowering Large Language Models to Follow Complex Instructions中…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
UE5 学习系列(二)用户操作界面及介绍
这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
DeepSeek 赋能智慧能源:微电网优化调度的智能革新路径
目录 一、智慧能源微电网优化调度概述1.1 智慧能源微电网概念1.2 优化调度的重要性1.3 目前面临的挑战 二、DeepSeek 技术探秘2.1 DeepSeek 技术原理2.2 DeepSeek 独特优势2.3 DeepSeek 在 AI 领域地位 三、DeepSeek 在微电网优化调度中的应用剖析3.1 数据处理与分析3.2 预测与…...
对WWDC 2025 Keynote 内容的预测
借助我们以往对苹果公司发展路径的深入研究经验,以及大语言模型的分析能力,我们系统梳理了多年来苹果 WWDC 主题演讲的规律。在 WWDC 2025 即将揭幕之际,我们让 ChatGPT 对今年的 Keynote 内容进行了一个初步预测,聊作存档。等到明…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
ardupilot 开发环境eclipse 中import 缺少C++
目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Mac下Android Studio扫描根目录卡死问题记录
环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中,提示一个依赖外部头文件的cpp源文件需要同步,点…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
