首页 热点资讯 义务教育 高等教育 出国留学 考研考公

有了阿里技术官的加持,我终于做到一问说清微服务JWT鉴权了!

发布网友 发布时间: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...

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com