分布式认证JWT

JWT解释

JWT是一种加密后的数据载体,可在各应用间进行数据传输。

JWT的组成

包含3部分。header(头)、payload(有效载荷)、signature(签名)。格式是header.payload.signature

Header组成
JWT的头部承载两部分信息
声明类型,默认是JWT
声明加密的算法 常用的算法:HMAC、RSA、ECDSA等

{"alg":"HS256""typ":"JWT"
}

alg:表示签名的算法,默认是 HMAC SHA256(写成 HS256);
typ:表示令牌(token)的类型,JWT 令牌统一写为 JwT。使用Base64加密,构成了JT第一部分-header

Payload组成
Payload 部分也是一个JSON 对象,用来存放实际需要传递的有效信息。
标准载荷:有很多,建议使用,但不强制,对T信息作补充。

标准载荷介绍
iss (issuer)签发人(谁签发的)
exp (expiration time)过期时间,必须要大于签发时间
sub (subject)主题(用来做什么)
aud (audience)受众(给谁用的)比如:http://www.xxx.com
nbf (Not Before)生效时间
iat (lssued At)签发时间
jti (JWT ID)编号,JWT的唯一身份标识

自定义载荷:可以添加任何的信息,一般添加用户的相关信息或其他业务需要的必要信息。但不建议添加敏感信息,因为该部分在客户端可解密。

{#自定义载荷"user_info":[{"id": "1"}{"name": "lili"},{"age": "18"}]#标准载荷"iat": 1681571257."exp":1682783999"aud":"xiaofei","iss":"dafei""sub": "alluser'
}

使用Base64加密,构成了JT第二部分payload

signature组成
Signature 部分是对前两部分的签名,防止数据篡改。
首先,需要指定一个密钥(secret)。这个密钥只有服务器才知道,不能泄露给用户。然后,使用 Header 里面指定的签名算法(默认是 HMAC SHA256),按照下面的公式产生签名。

signature =HMACSHA256(base64urlEncode(header)+""+ base64UrlEncode(payload),secret)

算出签名以后,把 Header、Pavload、signature 三个部分拼成一个字符串,每个部分之间用"点"(.)分隔,就可以返回给用户。
因为有这个密钥的存在,所以即便调用方偷偷的修改了前两部分的内容,在验证环节就会出现签名不一致的情况,所以保证了安全性。
使用Base64加密,构成了JT第三部分-signature

实践

 <dependencies><!--JWT(Json Web Token)登录支持--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-api</artifactId><version>0.11.5</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-impl</artifactId><version>0.11.5</version><scope>runtime</scope></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt-jackson</artifactId><version>0.11.5</version><scope>runtime</scope></dependency></dependencies>
public class JwtUtil {static String USER_INFO_USERNAME = "username";static int JWT_EXPIRATION = 24 * 60 * 60 * 1000;static String JWT_SECRET = "jwtsecretfdghfghfdfgdfgdfsgdfgdfgfdgdfgdfgdfgdfg";static String JWT_CREATE_TIME = "jwtCreateTime";static String USER_INFO_ID = "id";public static String createToken(Map<String, Object> claims) {String token = Jwts.builder()
//                .setHeader(new HashMap<>()).setAudience("Audience").setIssuer("Issuer").setSubject("Subject").setNotBefore(new Date()).setIssuedAt(new Date()).setId("jwt id").setClaims(claims)//载荷.setExpiration(generateExpirationDate()).signWith(Keys.hmacShaKeyFor(Decoders.BASE64.decode(JWT_SECRET))).compact();return token;}private static Date generateExpirationDate() {return new Date(System.currentTimeMillis() + JWT_EXPIRATION);}public static Claims parseToken(String token) {Claims claims = Jwts.parserBuilder().setSigningKey(Decoders.BASE64.decode(JWT_SECRET)).build().parseClaimsJws(token).getBody();return claims;}public static String getUsername(String token) {Claims claims = parseToken(token);return getValue(claims, USER_INFO_USERNAME);}public static boolean validateToken(String token) {Claims claims = parseToken(token);return claims != null && !isTokenExpired(token);}private static boolean isTokenExpired(String token) {Date expiredDate = getExpiredDate(token);return expiredDate.before(new Date());}private static Date getExpiredDate(String token) {Claims claims = parseToken(token);return claims.getExpiration();}private static String refreshToken(String token) {Claims claims = parseToken(token);claims.put(JWT_CREATE_TIME, new Date());return createToken(claims);}private static String getValue(Claims claims, String key) {return claims.get(key) != null ? claims.get(key).toString() : null;}
}

@RestController
public class UserController {private static Map<String, User> map = new HashMap();@GetMapping("/register")public String register(User user) {Map<String, Object> claims = new HashMap<>();claims.put(USER_INFO_ID, user.getId());claims.put(USER_INFO_USERNAME, user.getUsername());claims.put(JWT_CREATE_TIME, new Date());String token = JwtUtil.createToken(claims);map.put(token, user);return "/active?jwt= " + token;}public void active(String jwt) {User user = map.get(jwt);if (user != null && JwtUtil.validateToken(jwt)) {map.remove(jwt);System.out.println("active");} else {System.out.println("param 不合法 ");}}
}

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

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

相关文章

JAVA-数组乱序

实现步骤 假设有一组数组numbers从数组中最后一个元素开始遍历设置一个随机数作为循环中遍历到的元素之前的所有元素的下标&#xff0c;即可从该元素之前的所有元素中随机取出一个每次将随机取出的元素与遍历到的元素交换&#xff0c;即可完成乱序 实例如下&#xff1a; im…

day39 Bootstrap——容器简括

前言 前言Bootstrap5 容器容器内边距容器的边框和颜色响应式容器 前言 Bootstrap&#xff0c;来自 Twitter&#xff0c;是目前最受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JAVASCRIPT 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。 Bootstrap5 容器 B…

2022年美赛A题个人思路

一、读题 自行车运动员获胜的机会不同&#xff0c;但取决于赛事的类型、路线和自行车运动员的能力。 能量曲线&#xff1a;表明自行车运动员可以产生给定能量的时间长短对于特定的时间长度&#xff0c;能量曲线提供了自行车运动员在给定时间内保持的最大能量。 &#xff08;1&a…

wayland(xdg_wm_base) + egl + opengles 纹理贴图进阶实例(四)

文章目录 前言一、使用gstreamer 获取 pattern 图片二、代码实例1. pattern 图片作为纹理数据源的代码实例1.1 基于opengles2.0 接口的 egl_wayland_texture2_1.c1.2 基于opengles3.0 接口的 egl_wayland_texture3_1.c2. xdg-shell-client-protocol.h 和 xdg-shell-protocol.c3…

大模型LoRA知识

什么是 LoRA&#xff1f; LoRA&#xff08;low-rank adaptation of large language models&#xff09;是一种针对大型语言模型进行低秩适应的技术。大型语言模型通常具有数十亿个参数&#xff0c;这使得它们在计算和存储方面非常昂贵。低秩适应的目标是通过将语言模型的参数矩…

Gateway微服务网关

Spring Cloud Gateway Spring Cloud Gateway 是 Spring Cloud生态系统中的网关&#xff0c;它是基于Spring 5.0、SpringBoot 2.0和Project Reactor等技术开发的&#xff0c;旨在为微服务架构提供一种简单有效的、统一的API路由管理方式&#xff0c;并为微服务架构提供安全、监…

【力扣】5.最长回文子串

这道题我主要是通过动态规划来进行解题&#xff0c;看了我好久&#xff08;解析&#xff09;&#xff0c;生疏了呀。 首先就是判断一个字符串是不是回文&#xff0c;我们可以设置两个指针&#xff0c;从前往后进行判断即可&#xff0c;运用暴力解题法&#xff0c;这里运用的动…

【生产实测可用】Redis修改集群弱口令

起因 漏扫redis连接发现弱口令需要修改 先连上去看看是空口令还是弱口令 redis-cli -p 6379 -h a.b.c.d info sentinel找到启动服务器的配置文件 cp -av /app/redis-7001/redis.conf /app/redis-7001/redis.conf.bak20240207 echo "requirepass 口令" >>/a…

Gitee的使用教程(简单详细)

1.安装git&#xff08;我的电脑自带git&#xff0c;我没弄这步QAQ&#xff09; Git (git-scm.com)https://git-scm.com/ 安装好后在桌面点击鼠标右键会出现git GUI 和 git Bash&#xff08;没有的话点击显示更多选项&#xff09; 2.去gitee上注册一个账号 工作台 - Gitee.co…

Qt杂记——TCP

1. if(m_tcpSocket!nullptr){m_tcpSocket->flush();m_tcpSocket->abort();m_tcpSocket->deleteLater();m_tcpSocket nullptr;} &#xff08;1&#xff09;m_tcpSocket->flush() 调用m_tcpSocket->flush()函数可以强制将发送缓冲区中的数据立即发送出去&#…

toString方法

Object类中定义有public String toString()方法&#xff0c;其返回值是String类型。Object类中toString方法的源码为&#xff1a; public String toString(){return getClass().getName() "" Integer.toHexString(hashCode); } 根据如上源码得知&#xff0c;默认…

Spring Boot 笔记 008 创建接口_获取用户信息

1.1.1 编写userinfo接口 1.1.2 User实体类中增加转json忽略password注释 package com.geji.pojo;import com.fasterxml.jackson.annotation.JsonIgnore; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.Data;import java.time.LocalDateTime;//lombok 在…

C#查找字符串中的所有数字: 面向对象的自定义方法 vs 使用char.IsDigit()方法

目录 一、涉及到的方法 1.面向对象的自定义方法 2.面向对象编程技术定义 3.使用char.IsDigit()方法 二、实例 1.源码 2.生成效果 一、涉及到的方法 1.面向对象的自定义方法 查找字符串中的所有数字时&#xff0c;首先将所有数字存储到一个字符串数组中&#xff0c;然后…

【DDD】学习笔记-事件风暴与领域分析建模

在确定了全景事件流之后&#xff0c;可以在战略设计层面继续精进&#xff0c;鉴别出领域与限界上下文的边界&#xff0c;进入战术设计阶段的领域分析建模。 事件风暴的分析模型要素 通过事件风暴进行领域分析建模&#xff0c;其核心的模型要素就是“事件”。除此之外&#xf…

Windows平台git clone文件路径太长报错

问题描述 在Windows下拉取一些比较大的开源项目经常会提示文件路径太长&#xff08;filename too long&#xff09;&#xff0c;然后死活都不成功 解决办法 1.配置git git config --system core.longpaths true2.修改文件C:\Program Files\Git\etc\gitconfig&#xff08;需…

计算机视觉基础:矩阵运算

矩阵及其表示方式 一个矩阵是由行(row)和列(column)组成的一个矩形数组&#xff0c;通常包含数字。我们可以用大写字母&#xff08;如 A、B&#xff09;来表示一个矩阵。例如&#xff0c;矩阵 A 可能看起来像这样&#xff1a; A [ a11 a12 a13 ][ a21 a22 a23 ][ a31 a32 a3…

Windows 虚拟桌面信息(一)分析注册表

目录 前言 一、理论分析 二、代码实现 总结 本文为原创文章&#xff0c;转载请注明出处&#xff1a; https://blog.csdn.net/qq_59075481/article/details/136110636 前言 Win 10/11 的虚拟桌面微软暂时没有开放接口&#xff0c;有很多信息对开发者是闭塞的&#xff0c;…

阿里文档类图像的智能识别,文档分类自定义分类器

阿里云文档类图像智能识别服务为用户提供了强大的文档处理能力&#xff0c;可以将文档图像中的文本内容、表格数据和结构化信息自动识别并提取出来。而自定义分类器则允许用户根据自己的需求&#xff0c;训练出更适合自己场景的文档分类模型。本文将详细介绍阿里云文档类图像智…

Python学习之路-爬虫提高:selenium

Python学习之路-爬虫提高:selenium 什么是selenium Selenium是一个Web的自动化测试工具&#xff0c;最初是为网站自动化测试而开发的&#xff0c;Selenium 可以直接运行在浏览器上&#xff0c;它支持所有主流的浏览器&#xff08;包括PhantomJS这些无界面的浏览器&#xff09…

react【六】 React-Router

文章目录 1、Router1.1 路由1.2 认识React-Router1.3 Link和NavLink1.4 Navigate1.5 Not Found页面配置1.6 路由的嵌套1.7 手动路由的跳转1.7.1 在函数式组件中使用hook1.7.2 在类组件中封装高阶组件 1.8 动态路由传递参数1.9 路由的配置文件以及懒加载 1、Router 1.1 路由 1.…