JWT进阶-生成
< 返回列表时间: 2020-07-01来源:OSCHINA
创建JWT: String jwt=Jwts.builder().setSubject("Ag47").signWith(key).compact();
SignKey: 在枚举 io.jsonwebtoken.SignatureAlgorithm 中定义了常用的加密算法。
因为JWT对密码长度的要求,JJWT提供了相应的API: keys // 创建:对称加密 SecretKey key = Keys . secretKeyFor( SignatureAlgorithm . HS256 ); // 创建:不对称加密 KeyPair keyPair = Keys.keyPairFor(SignatureAlgorithm.RS256); /** 不对称加密,包括私钥[ keyPair.getPrivate() ]和公钥[ keyPair.getPublic() ]; 私钥用于加密。 公钥用于解密。 */
在Jwts.builder().signWith(key)中,也可以明确指定加密算法,如: signWith(key,SignatureAlgorithm.RS512).compact();
Header:
# 设置header时,不需要设置typ和alg两个key,JJWT会自动设置,即使手工设置也会被覆盖。
1. 使用setHeaderParam设置key-value header: Jwts.builder().setHeaderParam("name","Ag47");
2. 使用Header或Map<string,object> 设置key-value header: Header header=Jwts.header();
// Map<String,Object> header=new Map();
header.put("name","Ag47");
Jwts.builder().setHeader(header);
Claims:
JWT提供了系列标准的Claim,建议但不强制使用。 setIssuer:设置发布人信息,对应key=iss
setSubject:设置发布主题,对应key=sub
setAudience:设置接收人信息,如客户端Url数组,对应key=aud
setExpiration:设置到期时间,超期失效,对应key=exp
setNotBefore:设置这个时间之后才生效,对应key=nbf
setIssuedAt:该jwt的生成时间,对应key=iat
setId:该jwt的唯一标识,对应key=jti
例子: Jwts.builder().setIssuer("Ag47").setIssuedAt(new Date()).....
除了上述提供了之外,还可以自定义claims: Jwts.builder().claim("name","Ag47").claim("id","haha")....
或者: Claims claims=Jwts.claims();
// Map<String,Object> claims=new Map();
claims.put("name","Ag47");
Jwts.builder().setClaims(claims)...

关于exp和nbf时间差的问题:
如果生成jwt的机器和使用的机器时钟有偏差,可能会断言失败,这时候需要通过以下方式处理: long seconds=60*3;
Jwts.parserBuilder().setAllowedClockSkewSeconds(seconds)....builder().parseClaimsJws(jwt);
如果时差在3分钟之内,会忽略不计,如果差的很多,说明电脑时钟应该同步了。
Jwts解析时,默认使用的new Date() ,如果需要自定义,可以使用: Clock myClock=new MyClock();
Jwts.parserBuilder().setClock(myClock);
热门排行