JWT(JSON Web Token) 。即便用 Json 资料作为 web 网上层的令牌机制 。是 Java 实现 token 的一种仔细解决问题方案。JWT 可以使用 Hmac 算法或者是 RSA 的公私秘钥对进行签名 。以免资料伪造 。
(2)透视令牌 与 自包含令牌的区别:
引用(透视)令牌(reference token):指令牌存储的是资料标识符 。资料内容存储在很多地方 。也即随机生成一个 字符串(uuid 等)作为令牌 。不清楚该令牌的仔细含义 。只有通过 字符串 采访资料内容才能获得仔细信息。可以类比为 session_id 的使用 。
自包含令牌(Self-contained token):指令牌存储的是资料(一定且不隐私的资料) 。通过解析令牌就可以获得有关资料。此处使用的 JWT 即为一种自包含令牌 。
(3)JWT 优点:资料量小、简洁 。可以通过URL、 POST 参数、 以加密形式保存在应用。不需要保存在服务端 。易于扩展 。
(4)JWT 组成
JWT 是一个很长的字符串 。由三部分组成 。并使用 点(.) 隔开 。
Header.Payload.Signature 。即 JWT 头.有效载荷.签名 。
Header:用来存储 JWT 元资料。是一个 JSON 对象 。其中alg 表示加密算法(HS256、RS256) 。typ 表示 token 类别。
{ "alg": "HS256", "typ": "JWT"}【注:】HS256 指的是 HMAC SHA256(默认) 。一种对称算法 。选用同一个密钥生成、验证签名 。RS256 指的是 RSA SHA256 。一种非对称算法 。选用私钥生成签名 。用公钥验证签名 。Payload:
用来存放需要传递的资料(玩家信息) 。
其包含有些默认字段 。也完全可以自己定义设置字段(不反馈存储私密资料。易泄露) 。
【默认字段:】iss:发售人(JWT 生成的一方)exp:过期时光(要大于 iat)sub:主题aud:玩家(接收 JWT 的一方)nbf:在此时间之前JWT 不可用iat:JWT 发布时光jti:JWT ID用来标识该JWTSignature:
用来存放签名信息。
指定一个 密码(secret 。不可以公开给玩家。保存在服务端) 。按如下公式生成 。
HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)【理解:】对 header、payload 分别进行 Base64URL 加密 。使用 点(.)连接 。并根据 header 中指定的 加密算法 。使用 secret 对资料再一次加密 。注:由于 JWT 可以放在 URL 中(比如:/home?token=xxx) 。由于 Base64 中 =、+、/ 在 url 中有固定含义 。使用 base64 生成的 token 会出现问题 。Base64url 对这些符号进行了转换 。(去掉 = 。用 - 代替+ 。用 _ 代替/).3、SpringBoot 整合 JWT(1)添加依赖
!-- JWT --dependencygroupIdio.jsonwebtoken/groupIdartifactIdjjwt/artifactIdversion0.9.0/version/dependency
文章插图
(2)创建一个工具类(JwtUtil.java)用来操作 JWT 。
package com.lyh.admin_template.back.common.utils;import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jws;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import org.apache.commons.lang3.StringUtils;import javax.servlet.();}}
文章插图
(3)编编辑一个测试类(TestJWTController.java)。用来测试
package com.lyh.admin_template.back.controller.test;import com.lyh.admin_template.back.common.utils.JwtUtil;import com.lyh.admin_template.back.common.utils.Result;import io.jsonwebtoken.Claims;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RequestMapping("/test/jwt")@RestController@Api(tags = "测试 JWT")public class TestJWTController {@ApiOperation(value = https://www.wangchuang8.com/"获得token")@PostMapping("/getToken")public Result testJwt() {return Result.ok().data("token", JwtUtil.getJwtToken("1", "tom"));}@ApiOperation(value = "测试是否过期")@PostMapping("/testExpire")public Result testJwtExpire(String jwtToken) {if (JwtUtil.checkToken(jwtToken)) {Claims claims = JwtUtil.getTokenBody(jwtToken);return Result.ok().message("token 未过期").data("claims", claims);}return Result.ok().message("token 已过期");}}测试结果如下:定义过期时光为 30s 。未过期时 。返回 json 资料。
文章插图
推荐阅读
- 女生喜欢一个人时,会有什么样的暗示?
- 对于最近一些外国公司辱华事件,我们是不是应该立法来惩治外国公司的行为?
- 国土面积不大人口不足三千万 尼泊尔人口有多少人口
- 女人爱男人有什么表现?
- 对于DG辱华事件,你认为国人能坚持多久?
- 怎么区分女生把你当成好朋友,还是喜欢你?
- 美好祝愿的简短句子 有文化内涵又高雅的字祝福语
- 对于D&G辱华事件,你觉得应该继续原谅吗?原因是什么?
- 哪些细节能看出你心仪的女孩喜欢你?