电商项目-微服务网关鉴权JWT

ops/2024/12/15 11:27:04/

一 、什么是微服务鉴权

        当有了网关,用户所有的请求都会经过网关,然后由网关将用户请求,转发到具体某个服务。网关相当于后端服务的统一入口,所以现在非常方便的可以在网关系统中进行相关服务的权限校验。

        鉴权就是鉴定有没有访问的权限。如果当前用户有访问权限,网关就会把请求给到具体服务上,如果没有访问权限,就会在网关中直接拒绝掉。      

那么我们可以采用JWT的方式来实现鉴权校验。

二、JWT简介

        JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。

        一个JWT实际上就是一个字符串,它由三部分组成,头部、载荷与签名。

头部(Header)

        头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。

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

        在头部指明了签名算法是HS256算法。 我们进行BASE64编码base64 转图片 在线解码编码,编码后的字符串如下:

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9

载荷(playload)

载荷就是存放有效信息的地方。

        定义一个payload:

{"sub":"1234567890","name":"John Doe","admin":true}

        然后将其进行base64加密,得到Jwt的第二部分。

eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9

签证(signature)

        jwt的第三部分是一个签证信息,这个签证信息由三部分组成:

header (base64后的)

payload (base64后的)

secret

        这个部分需要base64加密后的header和base64加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。

TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

将这三部分用.连接成一个完整的字符串,构成了最终的jwt:

eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7HgQ

        三、JWT客户端签发与验证token

(1)创建token

(1)新建项目jwtTest中的pom.xml中添加依赖:

<dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version>
</dependency>

(2) 创建测试类,代码如下

JwtBuilder builder= Jwts.builder().setId("888")   //设置唯一编号.setSubject("小白")//设置主题  可以是JSON数据.setIssuedAt(new Date())//设置签发日期.signWith(SignatureAlgorithm.HS256,"it123");//设置签名 使用HS256算法,并设置SecretKey(字符串)
//构建 并返回一个字符串 
System.out.println( builder.compact() );

运行打印结果:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDQxODF9.ThecMfgYjtoys3JX7dpx3hu6pUm0piZ0tXXreFU_u3Y

        再次运行,会发现每次运行的结果是不一样的,因为我们的载荷中包含了时间。

(2) 验证token/解析token



        我们刚才已经创建了token ,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一样),那服务端接到这个token 应该解析出token中的信息(例如用户id),根据这些信息查询数据库返回相应的结果。

String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDQxODF9.ThecMfgYjtoys3JX7dpx3hu6pUm0piZ0tXXreFU_u3Y";
​
Claims claims = Jwts.parser().setSigningKey("it123").parseClaimsJws(compactJwt).getBody();
​
System.out.println(claims);


运行打印效果:

{jti=888, sub=小白, iat=1557904181}


试着将token或签名秘钥篡改一下,会发现运行时就会报错,所以解析token也就是验证token.


(3) 设置有效时间

        因为在大多数生产环境下,并不希望当前生成完令牌后 ,就是永久有效的。如果当前令牌是永久有效的,那么他的安全性绝对不高。一般都会对jwt令牌设置有效时间。
 

(1)创建token 并设置过期时间

//当前时间
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis);
JwtBuilder builder= Jwts.builder().setId("888")   //设置唯一编号.setSubject("老白")//设置主题  可以是JSON数据.setIssuedAt(new Date())//设置签发日期.setExpiration(date).signWith(SignatureAlgorithm.HS256,"it123");//设置签名 使用HS256算法,并设置SecretKey(字符串)
//构建 并返回一个字符串
System.out.println( builder.compact() );


解释:

.setExpiration(date)//用于设置过期时间 ,参数为Date类型数据


运行,打印效果如下:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDUzMDgsImV4cCI6MTU1NzkwNTMwOH0.4q5AaTyBRf8SB9B3Tl-I53PrILGyicJC3fgR3gWbvUI


(2)解析TOKEN

String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDUzMDgsImV4cCI6MTU1NzkwNTMwOH0.4q5AaTyBRf8SB9B3Tl-I53PrILGyicJC3fgR3gWbvUI";
​
Claims claims = Jwts.parser().setSigningKey("it123").parseClaimsJws(compactJwt).getBody();
​
System.out.println(claims);


运行测试:

抛出Exception in thread “main”  io.jsonwebtoken.ExpiredJwtException 异常

当前时间超过过期时间,则会报错。

(4)添加自定义信息

自定义claims:
        我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims。

创建测试类,并设置测试方法:

创建token:

@Test
public void createJWT(){//当前时间long currentTimeMillis = System.currentTimeMillis();currentTimeMillis+=1000000L;Date date = new Date(currentTimeMillis);JwtBuilder builder= Jwts.builder().setId("666")   //设置唯一编号.setSubject("老白")//设置主题  可以是JSON数据.setIssuedAt(new Date())//设置签发日期.setExpiration(date)//设置过期时间.claim("roles","admin")//设置角色.signWith(SignatureAlgorithm.HS256,"it123456");//设置签名 使用HS256算法,并设置SecretKey(字符串)//构建 并返回一个字符串System.out.println( builder.compact() );
}


运行打印效果:

eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDU4MDIsImV4cCI6MTU1NzkwNjgwMiwicm9sZXMiOiJhZG1pbiJ9.AS5Y2fNCwUzQQxXh_QQWMpaB75YqfuK-2P7VZiCXEJI


解析TOKEN:

//解析
@Test
public void parseJWT(){String compactJwt="eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiI4ODgiLCJzdWIiOiLlsI_nmb0iLCJpYXQiOjE1NTc5MDU4MDIsImV4cCI6MTU1NzkwNjgwMiwicm9sZXMiOiJhZG1pbiJ9.AS5Y2fNCwUzQQxXh_QQWMpaB75YqfuK-2P7VZiCXEJI";Claims claims = Jwts.parser().setSigningKey("it123456").parseClaimsJws(compactJwt).getBody();System.out.println(claims);
}


运行测试:


http://www.ppmy.cn/ops/142086.html

相关文章

购物车案例--分模块存储数据,发送请求数据渲染,底部总计数量和价格

shift鼠标右键&#xff0c;打开powershell&#xff0c;新建项目 自定义 只有一个页面&#xff0c;不涉及路由&#xff0c;勾选vuex,css,babel 无需保存预设 回车项目开始创建 项目用vscode打开 将src里的内容全部清空 将第七天的课程准备代码复制粘贴到src中 刷新页面&…

国内首本大模型中文版书籍!复旦大学《大规模语言模型·从理论到实践》全面的一本大模型图书!

看张奇教授的主页&#xff0c;感觉这教授、博导太牛了。 在大语言模型实践和理论研究的过程中&#xff0c;他与桂韬研究员、郑锐博士生以及黄萱菁教授&#xff0c;历时 8 个月共同完成了这本书《大规模语言模型从理论到实践》&#xff01; 有需要这本《大规模语言模型从理论到实…

可视化大屏:并非面子工程,而是价值驱动的创新工具

一、可视化大屏的广泛应用 如今&#xff0c;可视化大屏在众多领域都发挥着重要作用。在智慧城市领域&#xff0c;它整合了城市的交通、能源、环境等各类数据&#xff0c;为城市管理者提供了一个直观的决策支持平台。 通过可视化大屏&#xff0c;管理者可以实时了解城市的运行状…

python之xml和excel学习

dom解析 from xml.dom.minidom import parse import xml.dom.minidom# 使用minidom解析器打开 XML 文档 DOMTree xml.dom.minidom.parse("xxx.xml") collection DOMTree.documentElement# 根据标签名称获取 movies collection.getElementsByTagName("fistTa…

计算机操作系统保护与安全教学指南

一、引言 在当今数字化时代&#xff0c;计算机操作系统作为计算机系统的核心&#xff0c;其安全性至关重要。操作系统不仅要管理计算机的硬件资源&#xff0c;还要为各类应用程序提供运行环境。一旦操作系统的安全防线被攻破&#xff0c;可能导致用户数据泄露、系统瘫痪等严重…

渗透测试-前端验签绕过之SHA256+RSA

本文是高级前端加解密与验签实战的第2篇文章&#xff0c;本系列文章实验靶场为Yakit里自带的Vulinbox靶场&#xff0c;本文讲述的是绕过SHA256RSA签名来爆破登录。 绕过 根据提示可以看出这次签名用了SHA2556和RSA两个技术进行加密。 查看源代码可以看到RSA公钥是通过请求服务…

一座重庆工厂,智能与制造的“两江之约”

嘉陵江与长江在此交汇&#xff0c;勾勒出了重庆最独特的风景线&#xff0c;也成就了这座城市的千百年商贸兴盛与近代工业的崛起。 数字化、智能化时代&#xff0c;这座江边古城、工业重镇&#xff0c;也开始涌动着智能技术的创新源动力。其中最具代表性的&#xff0c;就是坐落在…

【动手学运动规划】 4.6 Hybrid A*算法

勇敢不是不感到恐惧&#xff0c;而是在恐惧面前仍然前行。 —《狮子王》 &#x1f3f0;代码及环境配置&#xff1a;请参考 环境配置和代码运行! 4.6.1 概述 Hybrid A* 是 2004 年 DARPA 城市挑战中的冠军车队使用的全局导航算法。相比与传统的 A* 算法&#xff0c;Hybrid A* …