PHPJWT的使用

今天得空整理整理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.rhkb.cn/news/420256.html

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

相关文章

U盘变成RAW格式怎么办?如何恢复!

U盘类型显示为RAW,导致无法正常读取或写入数据,怎么办?这种情况一般都表示U盘的文件系统无法被操作系统识别,可能原因包括:不正确的插拔操作、病毒攻击、电源故障等。当我们遇到U盘打不开变成RAW的时候不要慌&#xff…

【C++\Qt项目实战】俄罗斯方块

俄罗斯方块 1 项目简介2 效果展示3 代码实现3.1 框架3.2 UI界面3.3 核心代码3.3.1 TetrisGameWindow.h3.3.2 TetrisGameWindow.cpp3.3.3 Subject.h3.3.4 Subject.cpp3.3.5 TetrisGame.h3.3.6 TetrisGame.cpp 4 运行效果 1 项目简介 本项目灵感来自经典的俄罗斯方块游戏&#x…

视频智能分析平台LntonAIServer安防监控平台花屏检测、马赛克检测功能介绍

视频监控系统在现代社会中扮演着至关重要的角色,无论是用于安全监控、交通管理还是其他用途,视频的质量直接关系到系统的可靠性和有效性。LntonAIServer通过新增的视频质量诊断功能,包括花屏检测和马赛克检测,进一步增强了视频监控…

Windows系统下安装JMeter

目录 一、官网下载JMeter 二、运行 JMeter 一、官网下载JMeter JMeter 官网安装地址 Apache JMeter - Apache JMeter™https://jmeter.apache.org/ 下载Windows版本 下载完成后 解压 二、运行 JMeter 打开bin目录 下面两个文件其中一个均可运行双击jmeter.bat 或者使用…

算法入门-深度优先搜索3

第六部分:深度优先搜索 112.路径总和(简单) 题目:给你二叉树的根节点 root 和一个表示目标和的整数 targetSum 。判断该树中是否存在 根节点到叶子节点 的路径,这条路径上所有节点值相加等于目标和 targetSum 。如果…

[项目][WebServer][项目介绍及知识铺垫][上]详细讲解

目录 1.何为WWW?2.HTTP分层1.整体2.细节3.DNS?4.协议之间是如何协同运作的? 3.Http相关概念1.特点2.URI && URL && URN3.HTTP URL格式 1.何为WWW? WWW是环球信息网的缩写,常简称为Web分为Web客户端和Web服务器程序,WWW可…

简单计算机网络概念

1.浏览器过程 输入url,解析url 1.协议http、https的区别;HTTPS就是在HTTP与TCP之间增加了SSL/TSL安全传输层 2.格式:协议//主机:端口/路径; 3.HTTP版本:1.0和1.1 4.HTTP/1.1:1. 持久连接:为了…

数据结构————单链表

引言 在计算机科学的领域里,数据结构的探索与应用是程序设计的灵魂。单链表,作为一种基础而灵活的数据结构,不仅在理论上有着丰富的内涵,其在实际编程中的应用亦是广泛而深远。本文旨在深入浅出地介绍单链表的实现过程&#xff0c…

探探我对测试开发的看法?

测试开发岗位主要负责确保软件的可用性和稳定性。 ● 可用性不仅包括功能的正常使用,还涵盖了软件在不同环境下的兼容性,如各种网络环境、不同 CPU 核心环境以及多样化的移动端设备等。 ● 稳定性方面我的理解是,测试人员不仅要从用户角度评判…

OpenAI gym: How to get complete list of ATARI environments

题意:OpenAI Gym:如何获取完整的 ATARI 环境列表 问题背景: I have installed OpenAI gym and the ATARI environments. I know that I can find all the ATARI games in the documentation but is there a way to do this in Python, witho…

UE5 半透明阴影 快速解决方案

Step 1: 打开该选项 Step 2: 将半透明材质给到模型后,设置光照的Shadow Resolution Scale,越大,阴影的效果越好 Step 3: 用这种方式去做,阴影会因为半透明的程度,降低阴影的浓度 要…

使用Azure+C#+visual studio开发图像目标检测系统

在这篇文章里面,我们讲解使用AzureC#visual studio在Azure上做图像的目标检测系统。 笔者是头一次接触C#。之前以Python Java和Scala为主。感觉C#.Net是一种挺好用的开发系统。C#和Java非常像。会一个学另一个很快。 首先,目标检测是个什么东西&#x…

【高校主办,EI稳定检索】2024年人机交互与虚拟现实国际会议(HCIVR 2024)

会议简介 2024年人机交互与虚拟现实国际会议(HCIVR 2024)定于2024年11月15-17日在中国杭州召开,会议由浙江工业大学主办。人机交互,虚拟现实技术的发展趋势主要体现在系统将越来越实际化,也越来越贴近人类的感知和需求…

python-新冠病毒

题目描述 假设我们掌握了特定时间段内特定城市的新冠病毒感染病例的信息。在排名 i 的当天有 i 个案例,即: 第一天有一例感染第二天有两例感染第三天有三例感染以此类推...... 请计算 n 天内的感染总数和每天平均感染数。 输入 整数 n 表示天数&…

将星 x17 安装ubuntu 20.04 双系统

准备工作,包含关闭快速启动,关闭Secret Boot 1.进入控制面板选择小图标,找到电源选项 2.点击更改当前不可用的设置,关闭快速启动 3.开机启动时快速按F2,进入BIOS 4.选择Setup Utiltity,选择Security&#…

LeetCode 热题 100 回顾5

干货分享,感谢您的阅读!原文见:LeetCode 热题 100 回顾_力code热题100-CSDN博客 一、哈希部分 1.两数之和 (简单) 题目描述 给定一个整数数组 nums 和一个整数目标值 target,请你在该数组中找出 和为目标…

ArcGIS之建模处理栅格数据以表格显示分区统计(以夜间灯光数据为例)

当需要计算一个shp数据中多个面中的栅格数据值是,可以通过模型构建器进行批量处理,也就是统计多个面中的栅格数据值。但在处理过程中可能会遇见不同的错误,本文会介绍ERROR000883的解决办法。 数据准备:一个shp数据(例…

Idea 创建 Maven项目的时候卡死

文章目录 一、Archetype 和 Catalog1.1 Archetype(原型)1.2 Catalog(目录) 二、可能遇到的问题2.1 问题描述2.2 原因分析2.3 解决方案 参考资料 一、Archetype 和 Catalog 1.1 Archetype(原型) Archetype…

私域电商 IP 化发展的探索与优势

摘要:本文聚焦于私域电商与社交电商的区别,重点探讨私域电商的 IP 属性。深入分析其在获取流量、转化用户以及挖掘用户价值方面的独特优势。同时引入链动 2 1 模式、AI 智能名片、S2B2C 商城小程序源码等元素,详细阐述这些元素在私域电商 IP…

C++——哈希

目录 1.undered系列容器 1.1 undered_map 1.1.1 undered_map特点介绍 1.1.2 undered_map接口介绍 1.2 undered_set 2.底层结构 2.1 哈希概念 2.2 哈希冲突 2.3 哈希函数 2.3.1 哈希函数设计原则: 2.3.2 常见哈希函数 1.直接定值法 2.除留余数法 3.平方…