发布网友 发布时间:2024-09-07 10:11
共1个回答
热心网友 时间:2024-09-24 15:36
要说JWT,首先得谈谈鉴权这件事。鉴权在单体架构的服务中容易实现,但到了微服务架构,随着服务增多,鉴权就变得复杂了。毕竟,我们不可能为每个服务都做鉴权!
微服务系统架构中,网关扮演着重要角色。网关最适合进行权限校验。下面是微服务鉴权架构图:
看了架构图,我们可以采用JWT的方式来实现鉴权校验!这就是JWT场景。
注意:只有有需求,才会催生技术!很多同学不理解某项技术,是因为没有需求。我经常遇到某个技术,然后感慨“哦,原来之前的某某问题,可以用它解决呀!”。一下子就理解了。刚开始不理解这么显而易见的问题,很多学生就是给整不明白!最后想通了,很多同学的知识都是束之高阁,不落地!
废话不多讲,我们进入正题。
二、啥是JWT捏?全称JSON Web Token
JWT本质就是一个字符串书写规范,作用是用来在用户和服务器之间传递安全可靠的信息。
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成:
2.1 JWT三要素详解之头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
2.2 JWT三要素详解之载荷(Payload)
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分:
(1)标准中注册的声明(建议但不强制使用)
(2)公共的声明
(3)私有的声明
2.3 JWT三要素详解之签证(Signature)
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base后的) payload (base后的) secret
这个部分需要base加密后的header和base加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
将这三部分用.连接成一个完整的字符串,构成了最终的jwt:
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
三、JWT如何签发与验证?使用JJWT
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
官方文档:github.com/jwtk/jjwt
3.1 创建token
(1)新建项目中的pom.xml中添加依赖:
(2) 创建测试类,代码如下
运行打印结果:
再次运行,会发现每次运行的结果是不一样的,因为我们的载荷中包含了时间。
3.2 解析token
我们刚才已经创建了token,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一样),那服务端接到这个token应该解析出token中的信息(例如用户id),根据这些信息查询数据库返回相应的结果。
运行打印效果:
试着将token或签名秘钥篡改一下,会发现运行时就会报错,所以解析token也就是验证token。
3.3 设置过期时间
有很多时候,我们并不希望签发的token是永久生效的,所以我们可以为token添加一个过期时间。
(1)创建token并设置过期时间
解释:
运行,打印效果如下:
(2)解析TOKEN
打印效果:
当前时间超过过期时间,则会报错。
3.4 自定义claims
我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims。
创建测试类,并设置测试方法:
创建token:
运行打印效果:
解析TOKEN:
运行效果:
四、微服务鉴权完整代码实现方案
其实当你理解了JWT,鉴权的实现也就水到渠成!很好理解了,鉴权的逻辑很简单
4.1 技术架构思路分析
4.2 系统微服务签发token
(1)JwtUtil
(2)login方法,判断用户登录成功则签发TOKEN
4.3 网关过滤器验证token
(1)添加jjwt依赖
(2)创建JWTUtil类
(3)创建过滤器,用于token验证
4.4 最终测试总结
搞定JWT其实也并不难对吧!
最后
大家看完有什么不懂的可以在下方留言讨论。谢谢你的观看。觉得文章对你有帮助的话记得关注我点个赞支持一下!
作者:雄哥666 链接:juejin.im/post/654916...
热心网友 时间:2024-10-19 20:22
要说JWT,首先得谈谈鉴权这件事。鉴权在单体架构的服务中容易实现,但到了微服务架构,随着服务增多,鉴权就变得复杂了。毕竟,我们不可能为每个服务都做鉴权!
微服务系统架构中,网关扮演着重要角色。网关最适合进行权限校验。下面是微服务鉴权架构图:
看了架构图,我们可以采用JWT的方式来实现鉴权校验!这就是JWT场景。
注意:只有有需求,才会催生技术!很多同学不理解某项技术,是因为没有需求。我经常遇到某个技术,然后感慨“哦,原来之前的某某问题,可以用它解决呀!”。一下子就理解了。刚开始不理解这么显而易见的问题,很多学生就是给整不明白!最后想通了,很多同学的知识都是束之高阁,不落地!
废话不多讲,我们进入正题。
二、啥是JWT捏?全称JSON Web Token
JWT本质就是一个字符串书写规范,作用是用来在用户和服务器之间传递安全可靠的信息。
JSON Web Token(JWT)是一个非常轻巧的规范。这个规范允许我们使用JWT在用户和服务器之间传递安全可靠的信息。一个JWT实际上就是一个字符串,它由三部分组成:
2.1 JWT三要素详解之头部(Header)
头部用于描述关于该JWT的最基本的信息,例如其类型以及签名所用的算法等。这也可以被表示成一个JSON对象。
2.2 JWT三要素详解之载荷(Payload)
载荷就是存放有效信息的地方。这个名字像是特指飞机上承载的货品,这些有效信息包含三个部分:
(1)标准中注册的声明(建议但不强制使用)
(2)公共的声明
(3)私有的声明
2.3 JWT三要素详解之签证(Signature)
jwt的第三部分是一个签证信息,这个签证信息由三部分组成:
header (base后的) payload (base后的) secret
这个部分需要base加密后的header和base加密后的payload使用.连接组成的字符串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第三部分。
将这三部分用.连接成一个完整的字符串,构成了最终的jwt:
注意:secret是保存在服务器端的,jwt的签发生成也是在服务器端的,secret就是用来进行jwt的签发和jwt的验证,所以,它就是你服务端的私钥,在任何场景都不应该流露出去。一旦客户端得知这个secret, 那就意味着客户端是可以自我签发jwt了。
三、JWT如何签发与验证?使用JJWT
JJWT是一个提供端到端的JWT创建和验证的Java库。永远免费和开源(Apache License,版本2.0),JJWT很容易使用和理解。它被设计成一个以建筑为中心的流畅界面,隐藏了它的大部分复杂性。
官方文档:github.com/jwtk/jjwt
3.1 创建token
(1)新建项目中的pom.xml中添加依赖:
(2) 创建测试类,代码如下
运行打印结果:
再次运行,会发现每次运行的结果是不一样的,因为我们的载荷中包含了时间。
3.2 解析token
我们刚才已经创建了token,在web应用中这个操作是由服务端进行然后发给客户端,客户端在下次向服务端发送请求时需要携带这个token(这就好像是拿着一张门票一样),那服务端接到这个token应该解析出token中的信息(例如用户id),根据这些信息查询数据库返回相应的结果。
运行打印效果:
试着将token或签名秘钥篡改一下,会发现运行时就会报错,所以解析token也就是验证token。
3.3 设置过期时间
有很多时候,我们并不希望签发的token是永久生效的,所以我们可以为token添加一个过期时间。
(1)创建token并设置过期时间
解释:
运行,打印效果如下:
(2)解析TOKEN
打印效果:
当前时间超过过期时间,则会报错。
3.4 自定义claims
我们刚才的例子只是存储了id和subject两个信息,如果你想存储更多的信息(例如角色)可以定义自定义claims。
创建测试类,并设置测试方法:
创建token:
运行打印效果:
解析TOKEN:
运行效果:
四、微服务鉴权完整代码实现方案
其实当你理解了JWT,鉴权的实现也就水到渠成!很好理解了,鉴权的逻辑很简单
4.1 技术架构思路分析
4.2 系统微服务签发token
(1)JwtUtil
(2)login方法,判断用户登录成功则签发TOKEN
4.3 网关过滤器验证token
(1)添加jjwt依赖
(2)创建JWTUtil类
(3)创建过滤器,用于token验证
4.4 最终测试总结
搞定JWT其实也并不难对吧!
最后
大家看完有什么不懂的可以在下方留言讨论。谢谢你的观看。觉得文章对你有帮助的话记得关注我点个赞支持一下!
作者:雄哥666 链接:juejin.im/post/654916...