1. JWT 简单方法
1.1 JWT简介
1.1.1 JWT是什么
JSON Web Token 是一种标准,定义了在各方之间传输信息的URL安全方法。 该标准遵循RFC-7519规范。
1.1.2 JWT什么时候用
Authorization(授权),用户初次登录后可以得到一个令牌,在有效期内,使用户在进行请求时不再需要完成登录的动作。
Information Exchange(信息交换),安全的传输信息,JWT签名功能可以查出内容是否被篡改。
1.1.3 JWT结构
JSON类型
- 头部(header)
- 载荷(payload)
- 签证(signature)
Header:
{
"alg": "HS256", //JWT加密算法,默认HS256
"typ": "JWT"
}
JWT 各种header内容:RFC 7515 - JSON Web Signature (JWS) (ietf.org)
Payload:
所有官方字段:JSON Web Token (JWT) (iana.org)
还可以定义私有字段,例如
{
"password": "222",
"username": "3333"
}
Signature:
跟据Header和Payload内容加密得出,作用是防止用户篡改权限,密钥保存在服务端。
HMACSHA256(base64(header) + '.' + base64(payload))
上面三个主要结构结合起来得到一段字符串,中间以 "." 分隔。
示例:
1.1.4 JWT工作方式
存储可以在cookie中也可以在local storage里,验证token包括验证签名确保不被篡改和是否过期。
1.2 JWT简单实现
导入JWT的依赖
<dependency>
<groupId>com.auth0</groupId>
<artifactId>java-jwt</artifactId>
<version>3.10.0</version>
</dependency>
@ResponseBody
@RequestMapping("/register")
public String register(HttpServletRequest request, @RequestParam("username") String username, @RequestParam("password") String password) {
long time =System.currentTimeMillis() + 100 * 60 * 1000;
Date date = new Date(time);
String SECRET_KEY = "123456789";
Map<String, Object> map = new HashMap<>();
map.put("alg", "HS256");
map.put("typ", "JWT");
String token = JWT.create()
.withHeader(map) //可以不设定,使用默认的
.withClaim("username",username)
.withClaim("password",password)
.withExpiresAt(date) //指定令牌过期时间
.sign(Algorithm.HMAC256(SECRET_KEY));
return token;
}
token解析
@ResponseBody
@RequestMapping("/verify")
public String verify(HttpServletRequest request, @RequestParam("token") String token){
JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("123456789")).build();
DecodedJWT decodedJWT = jwtVerifier.verify(token);
String username = decodedJWT.getClaim("username").asString();//获取负载里面对应的内容
String password = decodedJWT.getClaim("password").asString();
return username+password;
}