TP5.1使用JWT进行Token令牌生成与验证

2023-10-30

传统互联网项目在实现保持登录状态、退出登录、接口请求等功能时会使用Session,但是众所周知Session数据在产生后会存储与服务器端,所以当用户量达到一定程度会相应影响到服务器的性能,且Session在前后端分离的项目中或是多服务器项目中的支持不是很好。但是Token不会产生这些问题,服务器端对Token只有生成和验证操作,不会存放数据,针对前后端分离的项目,包括手机APP和当前热门的小程序的支持都很不错,所以Token成为了用于验证的极好选择。

对Token有了一定了解后那么JWT又是什么呢?

JWT全称为Json Web Token,是一种基于Token的身份认证方案,JWT的安全特性可以使Token不被修改和伪造。

那么接下来就具体说说JWT如何在ThinkPHP5.1框架中得到应用:

首先我们需要使用Composer来为我们的TP5.1项目安装JWT。在TP5.1项目中使用命令行运行以下代码即可自动下载安装:

composer require firebase/php-jwt

运行后出现以下字样并在框架vendor下可以找到firebase即代表下载安装成功。
在这里插入图片描述
在这里插入图片描述

JWT成功集成到框架中后便可以使用了,这里再说明一下JWT生成的Token格式

首先我们可以进入JWT的官网,首页有一个Debugger可以用于查看生成与验证Token,除了官网我更推荐使用JWT的浏览器插件,不论哪种方法,最终使用效果都是一样的,我这里使用JWT插件来演示,首先打开Debugger就可以看到官方生成用于展示的Token:
在这里插入图片描述

可以清楚看到整个Token分为三个部分,每个部分之间有一个 . 作为隔断,首先红色的部分为头部(Header):说明此串码为JWT和加密所用的算法信息,紫色的部分为负载(Payload):用于添加想要传递的信息和Token基本设置等,最后蓝色的部分为验证签名(verify signature):用于密匙加密解密Token。知道了Token基本的格式后我们就可以开始使用TP5.1生成一个JWT看看效果了,为了方便演示,我将生成的函数放在了公共函数文件common.php中。

function createToken($adminId=666)
{
    $secret = "THIS_IS_SECRET";      //密匙
    $payload = [
        'iss'=>'sol',                //签发人(官方字段:非必需)
        'exp'=>time()+3600*24*7,     //过期时间(官方字段:非必需)
        'aud'=>'admin',              //受众(官方字段:非必需)
        'nbf'=>time(),               //生效时间(官方字段:非必需)
        'iat'=>time(),               //签发时间(官方字段:非必需)
        'admin_id'=>$adminId,        //自定义字段
        'admin'=>true                //自定义字段
    ];
    $token = JWT::encode($payload,$secret,'HS256');
    return $token;
}

代码中使用JWT生成Token需要三个参数,分别是负载(Payload)、密匙(secret)、加密算法(algorithm),其中密匙是由自己规定的,之后接收到传来的Token时需要使用此密匙来验证接收到的Token,负载部分为想要传输的信息,其中有一些字段为官方定义的,但是并不是必需的,除此之外我们还可以定义一些自己的私有字段用来传输额外信息,例如以上实例中将签发时间和生效时间设置为当前时间,Token过期时间为当前时间的七天后,并加上了自己定义的管理员ID字段和是否是管理员的字段。
定义好这些信息后就可以使用JWT的静态方法encode来生成一个Token,这里我使用halt来获取一下使用此函数生成的Token:

string(225) "eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.
eyJpc3MiOiJzb2wiLCJleHAiOjE1NjU1OTYyNzYsImF1ZCI6ImFkbWluIiwibmJmIjoxNTY0OTkxNDc2LCJpYXQiOjE1NjQ5OTE0NzYsImFkbWluX2lkIjoiNjY2IiwiYWRtaW4iOnRydWV9.
jCVh-13ZOBEiIORdmw9Ye191X9ZJNyjo4fN96umG878"

然后就可以复制一下这段Token使用官方的Debugger来测试一下是否正确:
在这里插入图片描述

可以看到右侧PAYLOAD里的信息和我们函数中定义的信息一致,但是下方显示验证失败,这是因为Debugger自动生成的Secret并不正确,将黑框内的secret改为我们定义的密匙:THIS_IS_SECRET后便验证成功了。
在这里插入图片描述

至此便成功的使用JWT生成可用的Token了,那么接下来就需要在框架中对接收到的Token进行验证了

同样在common.php中写入验证的函数:

function checkToken($token)
{
    try{
        $Result = JWT::decode($token,'THIS_IS_SECRET',['HS256']);
        return '验证成功';
    }
    catch (Exception $e)
    {
        return '验证失败';
    }
}

验证Token需要的静态方法decode同样需要三个参数,第一个是需要验证的Token,第二个是验证的密匙,第三个是加密算法。
如果验证成功则$Result的值为Token的负载(Payload)部分。如果验证失败的话则会抛出异常,所以Token验证环节需要用try catch
,这里对异常捕捉没有具体细分,不论是密匙错误还是Token过期还是其他错误统统都是验证失败,如果想将异常信息获取的具体一点可以使用firebase中的三个异常信息来捕获,请自己测试。
在这里插入图片描述

在具体业务中生成Token往往用于首次登录或者修改密码等信息后重登陆或者同账号异地登陆顶号操作,在用户进行操作时可以延长Token过期时间避免正在操作时突然提示Token过期重登陆破坏使用体验。后台生成Token和其他信息一起返回前端后需要将Token信息保存在本地存储或Cookie中,在下一次请求发送时将Token放在HTTP请求头中一起发送,后台在接收到后先验证Token是否正确可用在进行之后操作。
请求头添加Token只需在Ajax请求中添加以下字段即可:

headers:{ token:'HTTP HEADER AJAX TOKEN TEST'}

在后台获取只需使用Request静态方法单独获取头部token字段即可获取Token内容并进行后续的验证操作:

$token = Request::header('token');

需要JWT浏览器Debugger插件和JWT完整包的可以评论索取

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

TP5.1使用JWT进行Token令牌生成与验证 的相关文章

随机推荐

  • 团队工具

    worktile Teambition 今目标 钉钉
  • 【机器学习】- 支持向量机

    预备知识 1 法向量 Wx b 0 w是什么 Wx b 0是直线方程 其中w表示法向量 法向量的指向由具体值确定 例如x y 2 0 法向量为 1 1 指向右上方 2 距离公式 3 函数间隔 当w确定的时候 距离的远近可以比较分子 也就是说
  • python实用脚本(一)—— 批量修改目标文件夹下的文件名

    本期主题 python重命名文件脚本 批量修改某一文件夹下的后缀名 脚本 1 代码 2 使用 3 简单解析 1 代码 usr bin python3 coding utf 8 批量修改文件扩展名 import argparse import
  • python语言整理

    目录 一 python 1 python的基础语法 1 python的介绍 2 python的注释方法 1 单行注释 2 多行注释 三个单引号 或者三个双引号 3 python的数据类型 4 面向对象 2 python的构造函数 1 pyt
  • 【论文整理1】On the Continuity of Rotation Representations in Neural Networks

    1 前置知识 1 1 Gram Schmidt正交化 参考阅读 Gram Schmidt过程 看完这篇应该基本能理解 但是他对于公式的讲解有一个地方讲解得不是很清楚 即为什么分母是平方形式呢 1 2 差集 定义 差集是一种集合运算 记A B
  • Pytest自动化测试框架之Allure报告

    简介 Allure Framework是一种灵活的 轻量级 多语言测试报告工具 不仅可以以简洁的网络报告形式非常简洁地显示已测试的内容 而且还允许参与开发过程的每个人从日常执行中提取最大程度的有用信息和测试 从开发 测试的角度来看 Allu
  • 9.14 C++作业

    仿照vector手动实现自己的myVector 最主要实现二倍扩容功能 include
  • 浅尝MVVMLight…

    最近要写WPF技术的项目 所以要学习一下关于WPF的知识 今天呢了解了一下MVVM的知识 具体内容如下了 MVVM呢是Model View ViewModel的缩写了 MVVM的由来算是有MVP Model View Presenter 模
  • 计算机专硕自主命题的学校,这所计算机/软件都是B+的知名985大学,计算机专硕改为408!...

    复旦大学是上海的一所985大学 计算机学科评估是B 软件工程的的学科评估也是B 从往年来看 也吸引了不少同学报考 尤其是计算机专硕 自主命题 招人很多 虽然一年多之前有消息说不提供住宿 但是报考的人还是络绎不绝 但是 今年 复旦大学的计算机
  • BZOJ4347 [POI2016]Nim z utrudnieniem

    这题 挺厉害 我们可以用f i j k 表示前i个数 选的个数模d余j 异或和为k的方案数 我们要求的是f n 0 s s为所有数的异或和 另外在n是d的倍数的时候要减一 可是这样直接转移的话显然会超时 我们把所有权重从小到大排序 一个数和
  • 时序分解

    时序分解 MATLAB实现基于SVD奇异值分解的信号分解分量可视化 目录 时序分解 MATLAB实现基于SVD奇异值分解的信号分解分量可视化 效果一览 基本介绍 程序设计 参考资料 效果一览 基本介绍 SVD分解重构算法 MATLAB程序
  • CentOS 7中 rsync 备份数据使用实例

    rsync工具用于将文件和目录从一个位置同步到另一个位置 同步的位置可以在本地服务器或远程服务器上 在Centos中使用下面命令安装rsync 对于负荷较重的 rsync 服务器应该使用独立运行方式 yum install rsync xi
  • leaflet的基础用法

    leaflet的基础知识 1 divIcon自定义图标 var myIcon L divIcon className my div icon L marker 50 505 30 57 icon myIcon addTo map 2 fea
  • 【牛客网】 排序子序列

    时间限制 1秒 空间限制 32768K 牛牛定义排序子序列为一个数组中一段连续的子序列 并且这段子序列是非递增或者非递减排序的 牛牛有一个长度为n的整数数组A 他现在有一个任务是把数组A分为若干段排序子序列 牛牛想知道他最少可以把这个数组分
  • Latex插入Matlab代码

    usepackage listings lstset language Matlab lstset breaklines 自动将长的代码行换行排版 begin document lstinputlisting xx m 将待插入的xx m文
  • 小程序中的实时日志,直接在微信公众号可以看到数据

    前言 小程序中的实时日志 直接在微信公众号可以看到数据 具体操作 注意 小程序实时日志每天的条数就大为100w条 1 封装的log js方法 放到utils里面 var log wx getRealtimeLogManager wx get
  • 云环境部署django+uwsgi 生产环境

    准备条件 1 确保有一个能够用runserver正常启动的django项目 2 项目已上传到linux 3 linux上已部署好python环境 且已安装好项目所需的模块 安装uwsgi pip3 install uwsgi 基于uwsgi
  • 【Java】构造器(构造方法)是否可以被重写?

    1 前言 首先 构造器是不能被继承的 因为每个类的类名都不相同 而构造器名称与类名相同 所以根本谈不上继承 又由于构造器不能继承 所以就不能被重写 但是 在同一个类中 构造器是可以被重载的 其实 在之前的一篇博客中 我已经记录了重载和重写的
  • REGEXP_SUBSTR函数,感觉像行专列

    REGEXP SUBSTR函数格式如下 function REGEXP SUBSTR String pattern position occurrence modifier srcstr 需要进行正则处理的字符串 pattern 进行匹配的
  • TP5.1使用JWT进行Token令牌生成与验证

    传统互联网项目在实现保持登录状态 退出登录 接口请求等功能时会使用Session 但是众所周知Session数据在产生后会存储与服务器端 所以当用户量达到一定程度会相应影响到服务器的性能 且Session在前后端分离的项目中或是多服务器项目