PHPJWT的使用

news2024/12/25 13:21:37

今天得空整理整理JWT的代码

  1. 首先,我们得知道什么是JWT?

JWT(JSON Web Token)是一种开放标准(RFC7519),用于在网络应用环境中安全地传输声明信息。它是一种紧凑的、URL安全的令牌格式,常用于身份验证和信息交换。
当然,他也是支持解密的,地址:https://jwt.io/

2、它能用来干什么?

随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,因此慢慢发展成为token的方式做登录身份校验,然后通过token去取redis中的缓存的用户信息,随着之后jwt的出现,校验方式更加简单便捷化,无需通过redis缓存,而是直接根据token取出保存的用户信息,以及对token可用性校验,单点登录更为简单。

3、什么时候你应该用JSON Web Tokens

1、Authorization (授权) :这是使用JWT的最常见场景。一旦用户登录,后续每个请求都将包含JWT,允许用户访问该令牌允许的路由、服务和资源。单点登录是现在广泛使用的JWT的一个特性,因为它的开销很小,并且可以轻松地跨域使用。
2、Information Exchange (信息交换) : 对于安全的在各方之间传输信息而言,JSON Web
Tokens无疑是一种很好的方式。因为JWTs可以被签名,例如,用公钥/私钥对,你可以确定发送人就是它们所说的那个人。另外,由于签名是使用头和有效负载计算的,您还可以验证内容没有被篡改。

4、JSON Web Token的结构是什么样的

在这里插入图片描述

5、JSON Web Token由三部分组成,它们之间用圆点(.)连接。这三部分分别是:

  1. Header
  2. Payload
  3. Signature

6、因此,一个典型的JWT看起来是这个样子的:

xxxxx.yyyyy.zzzzz

7、组成部分

header
典型的由两部分组成:token的类型(“JWT”)和算法名称(比如:HMAC SHA256或者RSA等等)。

在这里插入图片描述

然后,用Base64对这个JSON编码就得到JWT的第一部分

Payload

JWT的第二部分是payload,它包含声明(要求)。声明是关于实体(通常是用户)和其他数据的声明。声明有三种类型: registered,public 和 private。

Registered claims : 这里有一组预定义的声明,它们不是强制的,但是推荐。比如:iss (issuer), exp(expiration time), sub (subject), aud (audience)等。

Public claims : 可以随意定义。

Private claims : 用于在同意使用它们的各方之间共享信息,并且不是注册的或公开的声明。 下面是一个例子:

在这里插入图片描述
对payload进行Base64编码就得到JWT的第二部分

注意,不要在JWT的payload或header中放置敏感信息,除非它们是加密的。

Signature
为了得到签名部分,你必须有编码过的header、编码过的payload、一个秘钥,签名算法是header中指定的那个,然对它们签名即可。

例如:HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(payload), secret)

签名是用于验证消息在传递过程中有没有被更改,并且,对于使用私钥签名的token,它还可以验证JWT的发送方是否为它所称的发送方。

8、大家请看,生成一个JWTtoken,然后神奇的一幕来了,将这串token放进上方jwt官网地址地址中,即将解密,如下图所示:


在这里插入图片描述

9、那么?JSON Web Tokens是如何工作的???

1、应用(或者客户端)想授权服务器请求授权。例如,如果用授权码流程的话,就是/oauth/authorize
2、当授权被许可以后,授权服务器返回一个access token给应用
3、应用使用access token访问受保护的资源(比如:API)

在这里插入图片描述

10、所以说,上方的操作方式是非常不安全的。所以我们即将采用,对称加密,每个用户加解密都使用一个共同的密钥key

11. 安装jwt扩展

composer require firebase/php-jwt

12. 安装加解密扩展,当然,不想使用此方法也可使用其他方法加解密。

composer require defuse/php-encryption

13. 废话不多说,直接上代码

	/**
     *  生成 JWT
     * @param $data
     * @return false|string
     * @throws \think\db\exception\DataNotFoundException
     * @throws \think\db\exception\DbException
     * @throws \think\db\exception\ModelNotFoundException
     */
    public static function makeJwtSecretKey($data)
    {
        // 这里的key是加密的key,需永久保存使用,建议保存到数据库的配置中或者env文件中
        $key = self::getJwtConfig(); 

        $payload = [
            'iat' => time(), // 签发时间
            'exp' => time() + Constant::JWT_EXP, // 过期时间
            'jti' => Utils::getValue($data, 'id'), // 添加一个唯一标识符
            'data' => [
                'pxo' => Utils::getValue($data, 'id'),
                'nickname' => Utils::getValue($data, 'nickname'),
                'area_code' => Utils::getValue($data, 'area_code'),
            ]
        ];

        // 编码 jwt,这里采用 HS256 加密
        $encode = JWT::encode($payload, $key, 'HS256');
        // 创建随机key,这个key是要保存起来的,对用户进行加解密
        $createKey = \Defuse\Crypto\Key::createNewRandomKey();
        $createKeyAscii = $createKey->saveToAsciiSafeString();
        $token =  Crypto::encrypt($encode, $createKey);
        $encry_key = base64_encode($createKeyAscii);

        $user_id = Utils::getValue($data, 'id');
        // 之所以这里使用redis保存encry_key是因为,这个key是非常重要的,不能暴露给外界看到,所以我在生成jwt的时候直接就将这个使用redis缓存起来,方便解析使用。
        RedisUtils::set('user_encry_key_' . $user_id, $encry_key, Constant::JWT_EXP);
        $res = User::where('id', $user_id)->update(['token' => $token, 'encry_key' => $encry_key]);
        if (!Utils::isValid($res)){
            return false;
        }

        return $token;
    }
	/**
     *  解码JWT
     * @param $token
     * @return int|\stdClass
     */
    public static function deJwtSecretKey($token, $userModel)
    {
        try {
            $key = self::getJwtConfig();

            $user_id = Utils::getValue($userModel, 'id');
            $encry_key = RedisUtils::get('user_encry_key_' . $user_id);
            $decryptionKey = \Defuse\Crypto\Key::loadFromAsciiSafeString(base64_decode($encry_key));
            $decodedToken = Crypto::decrypt($token, $decryptionKey);

            return JWT::decode($decodedToken, new Key($key, 'HS256'));
        } catch (ExpiredException $e) {
            //  这里处理令牌过期,这里的异常写的1,2我好容易区分是哪里出的问题。
            return 1;
        } catch (\Exception $e) {
            // 处理其他可能的异常
            Log::info( "Failed to decode token: " . $e->getMessage());
            return 2;
        }
    }
$deUserModel = JwtService::deJwtSecretKey($token, $userModel);
if (!is_object($deUserModel)){
	 switch ($deUserModel) {
	     case 1 :
	         $token = JwtService::makeJwtSecretKey($userModel);
	         if (!Utils::isValid($token)){
	             return Utils::fail(lang('用户唯一凭证生成失败'));
	         }
	         break;
	     case 2 :
	         $this->error(lang('令牌验证失败'));
	         break;
	 }
}

以上,大致也就这样了,其实还是蛮简单的奥,也希望大家能多多学习与交流

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

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

相关文章

(一)使用Visual Studio创建ASP.NET Core WebAPI项目

1.创建webAPI项目 选择ASP.NET Core Web API项目模版(基于.Core框架可以支持多种系统环境,所以我们选择.Core框架),点下一步。 2.项目名称 项目名称设置为:CoreWebAPI,点下一步 3.选择框架 选择.NET6.0框…

分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比

分类预测|基于黑翅鸢优化轻量级梯度提升机算法数据预测Matlab程序BKA-LightGBM多特征输入多类别输出 含对比 文章目录 一、基本原理BKA(Black Kite Algorithm)的原理LightGBM分类预测模型的原理BKA与LightGBM的模型流程总结 二、实验结果三、核心代码四、…

IP学习——twoday

双层Vlan标签 路由器常用命令: 查看当前端口,路由等的信息和配置:display this 查看当前路由器的所有信息: display current-configuration 查看当前路由器的指定信息: display current-configuration | include ip a…

HTML第一课 语法规范与常用标签

目录 ◆ HTML 语法规范 ◆ HTML 常用标签 4.2 标题标签 4.3 段落和换行标签 4.4文本格式化标签 4.5<div>和<span>标签 4.6图像标签和路径 4.7超链接标签 1.外部链接 2.内部链接 3.空链接 4.下载链接 5.锚点链接 ◆ HTML 中的注释和特殊字符​编辑 ◆ HTML 语…

Redis中String类型的基本命令

文章目录 一、String字符串简介二、常见命令setgetmgetmsetsetnxincrincrbydecrdecrbyincrbyfloatappendgetrangesetrangestrlen 三、命令小结四、字符串内部编码五、String典型使用场景1. 缓存(Cache)功能2. 计数功能3. 共享会话&#xff08;Session&#xff09;4. 手机验证码…

软件测试学习笔记丨Pytest+Allure测试计算器

本文转自测试人社区&#xff0c;原文链接&#xff1a;https://ceshiren.com/t/topic/31954 项目要求 3.1 项目简介 计算器是近代人发明的可以进行数字运算的机器。 计算器通过对加法、减法、乘法、除法等功能的运算&#xff0c;将正确的结果展示在屏幕上。 可帮助人们更方便的…

FLTRNN:基于大型语言模型的机器人复杂长时任务规划

目录 一、引言二、FLTRNN框架2.1 任务分解2.2 基于语言的递归神经网络&#xff08;Language-Based RNNs&#xff09;长期记忆&#xff08;Long-Term Memory, Ct&#xff09;&#xff1a;短期记忆&#xff08;Short-Term Memory, Ht&#xff09;&#xff1a; 2.3 增强推理能力的…

GAMES104:12 游戏引擎中的粒子和声效系统-学习笔记

文章目录 一&#xff0c;粒子基础Particle System二&#xff0c;粒子渲染三&#xff0c;GPU粒子及生命周期控制四&#xff0c;粒子应用五&#xff0c;声音基础5.1 Sound System5.2 Digital Sound5.3 Audio Rendering QA 一&#xff0c;粒子基础Particle System 网游里你的付费…

[数据结构]红黑树之插入操作(RBTree)

这里只着重介绍插入操作的实现&#xff1a;) 一、红黑树的概念和性质 红黑树&#xff08;Red Black Tree&#xff09;是一种自平衡的二叉搜索树。红黑树最初在1972年由Rudolf Bayer发明&#xff0c;当时被称为平衡二叉B树&#xff08;symmetric binary B-trees&#xff09;。随…

2024 年高教社杯全国大学生数学建模竞赛B题解题思路(第一版)

原文链接&#xff1a;https://www.cnblogs.com/qimoxuan/articles/18399372 赛题&#xff1a; 问题 1&#xff1a;抽样检测方案设计 分析&#xff1a; 抽样检测方案需要在保证决策准确性的同时&#xff0c;尽量减少检测成本。需要考虑抽样误差对决策的影响&#xff0c;以及如…

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用

OCR经典神经网络(一)文本识别算法CRNN算法原理及其在icdar15数据集上的应用 文本识别是OCR&#xff08;Optical Character Recognition&#xff09;的一个子任务&#xff0c;其任务为&#xff1a;识别一个固定区域的的文本内容。 在OCR的两阶段方法里&#xff0c;文本识别模型接…

若依框架登录鉴权详解(动态路由)

若依框架登录鉴权&#xff1a;1.获取token&#xff08;过期在响应拦截器中实现&#xff09;,2.基于RBAC模型获取用户、角色和权限信息&#xff08;在路由前置守卫&#xff09;&#xff0c;3.根据用户权限动态生成&#xff08;从字符串->组件&#xff0c;根据permission添加动…

linux搭建深度学习平台

linux搭建深度学习平台&#xff08;Ubuntu&#xff09; /home/guangyao/anaconda3 我服务器的anaconda地址 ~/anaconda3 1 首先就是打开浏览器&#xff0c;我实验室的是火狐&#xff0c;搜索anaconda下载&#xff0c;找到下载目录&#xff0c;cd进去&#xff0c; 2安装 bas…

【佳学基因检测】在bagisto中,grouped products(同组产品)和bundled products(打包产品)有什么不同?

【佳学基因检测】在bagisto中&#xff0c;grouped products&#xff08;同组产品&#xff09;和bundled products&#xff08;打包产品&#xff09;有什么不同&#xff1f; 在Bagisto电商平台中&#xff0c;**grouped products&#xff08;同组产品&#xff09;和bundled prod…

iceberg存储结构详解

iceberg底层组织方式 下图是Iceberg中表格式&#xff0c;s0、s1代表的是表Snapshot信息&#xff0c;每个表示当前操作的一个快照&#xff0c;每次commit都会生成一个快照Snapshot&#xff0c;每个Snapshot快照对应一个manifest list 元数据文件&#xff0c;每个manifest list …

2024国赛数学建模预测算法-BP神经网络模型的预测精度分析(MATLAB 实现)

人工神经网络 第一节 人工神经网络概述 在您阅读这本书的时候&#xff0c;大约有个相互连接的神经元在帮助您阅读、呼吸、思考&#xff0c;以及完成各种各样的动作。这些神经元中&#xff0c;有些有着与生俱来的功能&#xff0c;比如呼吸、吮吸&#xff0c;有些则是由后天训练…

动态规划DP--背包问题

文章目录 0-1背包问题 -- 问题定义动态规划解法代码题目&#xff1a;分割等和子集题解 0-1背包问题 – 问题定义 在 0-1 背包问题中&#xff0c;给定一个背包的最大容量 W&#xff0c;以及 n 个物品&#xff0c;每个物品有两个属性&#xff1a; 重量&#xff1a;第 i 个物品的…

[数据集][目标检测]电动车入梯进电梯电单车入梯检测数据集VOC+YOLO格式7106张3类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;7106 标注数量(xml文件个数)&#xff1a;7106 标注数量(txt文件个数)&#xff1a;7106 标注…

广义回归神经网络(GRNN)

一、简介 广义回归神经网络 (General Regression Neural Network &#xff0c; GRNN) 的概念是由德 国科学家多纳德提出的&#xff0c;是径向基网络的其中一种 。因为其是以数理统计为基 础的&#xff0c;因此 GRNN 可以依据样本数据逼近其中包含的非线性映射关系。即使样本 数…

家里有猫用宠物空气净化器有用吗?希喂、米家、有哈哪款更好

在快节奏的现代生活中&#xff0c;越来越多的人选择宠物作为心灵的慰藉与生活的伴侣。起初&#xff0c;这份陪伴的需求简单而纯粹&#xff0c;但随着日子一天天过去&#xff0c;那份简单的情感逐渐生根发芽&#xff0c;成长为深厚的责任与爱。我在前两年养了两只猫&#xff0c;…