「这是我参与11月更文挑战的第17天,活动详情查看:2021最后一次更文挑战」
前言
相信很多后端的小伙伴,在做权限认证的时候,首先想到的是基于session或者token的认证。当我们在做分布式站点集群的用户单点登录的时候,基于session和token的认证就有局限性了,那么有没有更好的方式去处理认证问题呢,下面与大家介绍一下JWT。
什么是JWT
JWT是JSON WEB TOKEN的简称,JWT是一个开放标准(RFC 7519)经常用于在多方之间安全的传输信息。JWT由于有较高的信息安全性,被广泛的应用于授权和信息交互方面。在被JWT加密的信息是一种紧密的自包含的数据串。
JWT格式
JWT格式是由三段信息构成的,它们之间用圆点(.)连接,第一部分是头部信息,第二部分是载荷信息,第三部分是签证信息。如下字符串是一个JWT格式的字符串。
- eyJhbGciOiJIUzI1NiJ9:是头部信息,头部信息主要是token的类型和算法等信息。
- eyJqdGkiOiIxIiwic3ViIjoiYWRtaW4xMjM0NTYiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjM2NDI5LCJleHAiOjE2MzcyMzY0Mzl9:载体信息,主要是加密的数据资源信息。
- t5pAMGV0Rx3C455f5c812yvqnC6UqwiTpALeo5EFvR8:签证信息。签证信息主要用于验证消息在传递过程中有没有被篡改。
需要注意的是,在头部信息和载体信息z中放置敏感的信息,需要先加密处理。
1 | 复制代码eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoiYWRtaW4xMjM0NTYiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjM2NDI5LCJleHAiOjE2MzcyMzY0Mzl9.t5pAMGV0Rx3C455f5c812yvqnC6UqwiTpALeo5EFvR8 |
快速开始
本次将基于Spring Boot 搭建一个学习Mybatis_Plus的乐观锁的Demo。开发环境如下:
1 | sql复制代码JDK1.8 |
依赖
本次需要加入JWT相关的依赖包,具体依赖如下,如有不同版本,可能存在于SpringBoot兼容性问题,找到实配版本即可。
1 | xml复制代码 <dependency> |
创建JWT
SignatureAlgorithm中定义的标准JWT签名算法支持的算法名称,可以直接引用即可。具体定义的算法名称如下图:
本次采用的签名算法是:SHA-256。
首先指定本次JWT使用的签名算法。具体信息如下:
1 | js复制代码SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256; |
再次设置秘钥信息SecretKey。采用Base64对秘钥转换成字节数组。创建一个SecretKeySpec密钥规范。采用AES加密。
1 | js复制代码 |
下面根据JwtBuilder创建Jwt对象,JwtBuilder继承了ClaimsMutator。调用Jwts.builder(),设置builder的基本参数创建JwtBuilder。
1 | js复制代码 JwtBuilder builder = Jwts.builder().setId(id).setSubject(subject) |
主要包含:ID ,subject加密内容、Issuer签发者信息、IssuedAt签发时间、Expiration过期时间、signatureAlgorithm签名使用的算法和secretKey秘钥信息。
然后调用builder.compact()方法即可创建JWT字符串。例如使用字符串:“掘金——代码不止,掘金不停”生成一串JWT信息如下:
1 | js复制代码eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiIxIiwic3ViIjoi5o6Y6YeR4oCU4oCU5Luj56CB5LiN5q2i77yM5o6Y6YeR5LiN5YGcIiwiaXNzIjoidXNlciIsImlhdCI6MTYzNzI0MjY0NywiZXhwIjoxNjM3MjQyNjU3fQ.mMkMRyxVTcOSZCDrR5cGvY6KcRPCVVQwETSyPQMSAQo |
验证JWT
上面已经创建了JWT信息,当我们获取到JWT信息怎么验证和读取JWT中包含的信息呢,下面就开始介绍验证JWT。其中secretKey是上面介绍到的秘钥信息,获取方法与上面类似,参数jwt是创建的JWT信息。然后通过getBody()获得Claims、
1 | js复制代码Jwts.parser().setSigningKey(secretKey).parseClaimsJws(jwt).getBody(); |
JWT Claims主要包含:用户身份标识ID,iss签发人信息,sub内容信息,iat签发时间,exp过期时间等。以上是JWT创建过程的建立和验证,下面在Spring Boot项目中进行验证使用。
测试JWT
在Spring Boot项目中进行验证使用。本次验证使用两个接口调用验证,一个是获取JWT接口,一个是验证JWT接口,将获取到的JWT信息传输到验证接口,看是否能获取到JWT中的信息。接口如下:
1 | js复制代码 |
启动项目之后,先调用获取JWT的接口,可以看到已经获取到了JWT。
1 | js复制代码eyJhbGciOiJIUzI1NiJ9.eyJqdGkiOiJqdWVqaW4iLCJzdWIiOiLmjpjph5HigJTigJTku6PnoIHkuI3mraLvvIzmjpjph5HkuI3lgZwiLCJpc3MiOiJ1c2VyIiwiaWF0IjoxNjM3MjQ1MTQwLCJleHAiOjE2MzcyNDUxNTB9.WKso2dPHEtSx_ItCCXmq2QjSDR6AIBzetKft4CJ8wNQ |
然后经获取到的JWT调用验证JWT的接口,返回“掘金——代码不止,掘金不停”,验证成功。
结语
好了,以上就是Spring Boot 集成JWT的一个简单示例,感谢您的阅读,希望您喜欢,如对您有帮助,欢迎点赞收藏。如有不足之处,欢迎评论指正。下次见。
作者介绍:【小阿杰】一个爱鼓捣的程序猿,JAVA开发者和爱好者。公众号【Java全栈架构师】维护者,欢迎关注阅读交流。
本文转载自: 掘金