1. JWT令牌技术
1. 简介:
- 全称:JSON Web Token 官网:https://jwt.io/
- 定义了一种简洁的、自包含的格式,用于在通信双方以
json
数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。
2. 组成:
- 第一部分: Header(头),记录令牌类型、签名算法等。例如:
{"alg":"HS256", "type":"JwT"}
- 第二部分: Payload(有效载荷),携带一些自定义信息、默认信息等。例如:
{"id":"1","username":"Tom"}
- 第三部分: Signature(签名),防止
Token
被篡改、确保安全性。将header
、payload
,并加入指定秘钥,通过指定签名算法计算而来。
生成JWT令牌时要对JSON格式的数据进行Base64编码:一种基于64个可打印字符(A-Z a-Z 0-9 + /)来表示二进制数据的编码方式。文章来源:https://www.toymoban.com/news/detail-500611.html
//原始的JWT令牌:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkpvaG4gRG9lIiwiaWF0IjoxNTE2MjM5MDIyfQ.SflKxwRJSMeKKF2QT4fwpMeJf36POk6yJV_adQssw5c
//1.HEADER:ALGORITHM & TOKEN TYPE (头)
{
"alg": "HS256",
"typ": "JWT"
}
//2.PAYLOAD:DATA (有效载荷)
{
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
//3.VERIFY SIGNATURE (数字签名)--通过前面的数据,执行签名算法
HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
)
3. 应用场景
- 场景:登录认证。
- 登录成功后,生成令牌
- 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理
4. JWT-生成
- 首先需要引入
pom.xml
依赖:
<!-- JWT令牌-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.1</version>
</dependency>
- 创建一个测试类
/**
* 生成JWT令牌
*/
@Test
public void testGenJwt() {
//利用Map集合来整合需要存储的数据
Map<String, Object> claims = new HashMap<>();
claims.put("id", 1);
claims.put("name", "tom");
//链式编程
String jwt = Jwts.builder()
.signWith(SignatureAlgorithm.HS256, "mannor")//签名算法 解析密钥
.setClaims(claims)//自定义内容(载荷)
.setExpiration(new Date(System.currentTimeMillis() + 3600 * 1000))//设置有效期为1h
.compact();
System.out.println(jwt);
//控制台输出:eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ4OTkxOH0.FmNSF7KDVZ9SaGoVJb6jNDq_oqlgSeUcFBskGNgy0UE
}
- 把输出的JWT令牌发放到官网的Encoded下可以看见原始数据
5. JWT-解析
/**
* 解析JwT
*/
@Test
public void testParseJwt() {
Claims claims = Jwts.parser()
.setSigningKey("mannor") //解析密钥
.parseClaimsJws("eyJhbGciOiJIUzI1NiJ9.eyJuYW1lIjoidG9tIiwiaWQiOjEsImV4cCI6MTY4NzQ5MTIwN30.Tjzr4CKzwJcGtYwiRCo7d71z6WNugMMefu09hUp5H3o")
.getBody();
System.out.println(claims);
}
- JWT校验时使用的签名秘钥,必须和生成JWT令牌时使用的秘钥是配套的。
- 如果JWT令牌解析校验时报错,则说明JWT令牌被篡改或失效了,令牌非法。
2.JWT的登录校验实现(登录-生成令牌)
1. 步骤:
- 引入JWT令牌操作工具类。
- 登录完成后,调用工具类生成JWT令牌,并返回。
2. 编写一个Util工具类:
import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
import java.util.Map;
public class JwtUtils {
private static String signKey = "mannor"; //登录令牌
private static Long expire = 43200000L; //十二个小时后过期
/**
* 生成JWT令牌
* @param claims JWT第二部分负载 payload 中存储的内容
* @return
*/
public static String generateJwt(Map<String, Object> claims){
String jwt = Jwts.builder()
.addClaims(claims)
.signWith(SignatureAlgorithm.HS256, signKey)
.setExpiration(new Date(System.currentTimeMillis() + expire))
.compact();
return jwt;
}
/**
* 解析JWT令牌
* @param jwt JWT令牌
* @return JWT第二部分负载 payload 中存储的内容
*/
public static Claims parseJWT(String jwt){
Claims claims = Jwts.parser()
.setSigningKey(signKey)
.parseClaimsJws(jwt)
.getBody();
return claims;
}
}
3. 重新编写Controller层代码:
import com.mannor.Service.EmpService;
import com.mannor.pojo.Emp;
import com.mannor.pojo.Result;
import com.mannor.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.HashMap;
import java.util.Map;
@Slf4j
@RestController
public class LoginController {
@Autowired
private EmpService empService;
@PostMapping("/login")
public Result login(@RequestBody Emp emp) {
log.info("登录的查询参数:{},{}", emp.getUsername(), emp.getPassword());
Emp e = empService.loginSelect(emp);
//登陆成功生成令牌,下发令牌
if (e != null) {
Map<String, Object> claim = new HashMap<>(); //存如我们需要的信息,ID,name、username
claim.put("id", e.getId());
claim.put("name", e.getName());
claim.put("username", e.getUsername());
String jwt = JwtUtils.generateJwt(claim);//jwt中包含了员工当前的登录信息
return Result.success(jwt);
}
//登录失败,返回错误信息
return Result.error("用户名或密码错误,请检查重新输入");
}
}
剩下的就需要拦截器来处理文章来源地址https://www.toymoban.com/news/detail-500611.html
到了这里,关于JWT令牌技术(详解)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!