JWT令牌
概念:JSON Web Token
json:三部分组成,头部、载荷与签名
1 Header:{“typ”:“JWT”,“alg”:“HS256”} =》base64
2 playload:{“sub”:“1234567890”,“name”:“John Doe”,“admin”:true} =》base64
3 signature:将前两部分用”.“链接后使用算法加密。
签证需要base64加密后的header和base64加密后的payload使用.连接组成的字符
串,然后通过header中声明的加密方式进行加盐secret组合加密,然后就构成了jwt的第
三部分。
HMACSHA256(
base64UrlEncode(header) + "." +base64UrlEncode(payload),secret)
例子:eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6I
kpvaG4gRG9lIiwiYWRtaW4iOnRydWV9.TJVA95OrM7E2cBab30RMHrHDcEfxjoYZgeFONFh7Hg
Q
JJWT签发与验证token
创建token
(1)新建项目jwtTest中的pom.xml中添加依赖
maven项目
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
<version>0.9.0</version>
</dependency>
public static void main(String[] args) {
//获取系统的当前时间
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis);
//生成jwt令牌
JwtBuilder jwtBuilder = Jwts.builder()
.setId("666")//设置jwt编码
.setSubject("程序员")//设置jwt主题
.setIssuedAt(new Date())//设置jwt签发日期
//.setExpiration(date)//设置jwt的过期时间
.signWith(SignatureAlgorithm.HS256, "xxxxxxx");//设置签名 使用HS256算法, 并设置SecretKey(字符串)
//生成jwt
String jwtToken = jwtBuilder.compact();
System.out.println(jwtToken);
}
验证base64 https://tool.oschina.net/encrypt?type=3
解析token
Claims claims = Jwts.parser().setSigningKey("xxxxxxx").parseClaimsJws(jwtToken).getBody();
System.out.println(claims);
注意:设置签名key必须和生成时一致。
设置过期时间
生成令牌不能永久有效。要不然非常危险。黑客拿到令牌会攻击服务器集群
//获取系统的当前时间
long currentTimeMillis = System.currentTimeMillis();
Date date = new Date(currentTimeMillis);
.setExpiration(date)//设置jwt的过期时间
结果,解析令牌时,会报错,因为令牌过期。
尝试增加过期时间,则不会报错。
Date date = new Date(currentTimeMillis+100000);
生成令牌时,可以增加中间负载中增加自定义内容。
.claim("roles","admin").claim("company","gongsimin")
jwt令牌第二部分变长。