在网上搜了一大片关于JWT的,都没有讲清楚是怎么生成和解析的,今天来一波全过程。
JWT主要是是为了在网络应用环境间传递声明而执行的一种基于JSON的开放标准((RFC 7519).该token被设计为紧凑且安全的,特别适用于分布式站点的单点登录(SSO)场景。JWT的声明一般被用来在身份提供者和服务提供者间传递被认证的用户身份信息,以便于从资源服务器获取资源,也可以增加一些额外的其它业务逻辑所必须的声明信息,该token也可直接被用于认证,也可被加密。
我这里是利用一个info.java的实体类来表示要传递的参数值,一般情况下我觉得利用Map传递参数的比较多 下面开始搭建: 首先你需要引入的jar包
然后新建一个JwtUtils.java:
public class JwtUtils {
//得到subject
public static String generalSubject(Info info){
JSONObject jo = new JSONObject();
jo.put("id", info.getId());
jo.put("userid", info.getUserid());
jo.put("key", info.getKey());
return jo.toJSONString();
}
//这里是传入值生成jwt
public static String createJWT(String id, String issuer, String subject, long ttlMillis) {
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
long nowMillis = System.currentTimeMillis();
Date now = new Date(nowMillis);
byte[] apiKeySecretBytes = DatatypeConverter.parseBase64Binary(Constant.JWT_SECRET);
Key signingKey = new SecretKeySpec(apiKeySecretBytes, signatureAlgorithm.getJcaName());
JwtBuilder builder = Jwts.builder().setId(id).setIssuedAt(now).setSubject(subject).setIssuer(issuer)
.signWith(signatureAlgorithm, signingKey);
if (ttlMillis >= 0) {
long expMillis = nowMillis + ttlMillis;
Date exp = new Date(expMillis);
builder.setExpiration(exp);
}
return builder.compact();
}
//解析jwt
public static void parseJWT(String jwt) {
Claims claims = Jwts.parser().setSigningKey(DatatypeConverter.parseBase64Binary(Constant.JWT_SECRET))
.parseClaimsJws(jwt).getBody();
System.out.println("ID: " + claims.getId());
System.out.println("Subject: " + claims.getSubject());
System.out.println("Issuer: " + claims.getIssuer());
System.out.println("Expiration: " + claims.getExpiration());
}
}
下面是我传递参数的一个类Info(可参考):
public class Info {
private String id;
private String userid;
private String key;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUserid() {
return userid;
}
public void setUserid(String userid) {
this.userid = userid;
}
public String getKey() {
return key;
}
public void setKey(String key) {
this.key = key;
}
}
下面是一些默认的配置,比如说过期时间,秘钥等信息:
public class Constant
{
public static final String JWT_ID = "jwttest";
public static final String JWT_SECRET = "LLL blog";
public static final int JWT_TTL = 60*60*1000; //millisecond
public static final int JWT_REFRESH_INTERVAL = 55*60*1000; //millisecond
public static final int JWT_REFRESH_TTL = 12*60*60*1000; //millisecond
}
到这里的话基本上配置就齐全了,然后就是我们的主函数:
public class Main {
public static void main(String[] args) throws Exception {
Info info = new Info();
info.setId("This is LLL blog");
info.setUserid("123456789");
info.setKey("LLL丶禾羊 blog key value");
String generalSubject = JwtUtils.generalSubject(info);
String token = JwtUtils.createJWT("oschina", "issuerdata", generalSubject, Constant.JWT_TTL);
//输出token
System.out.println(token);
JwtUtils.parseJWT(token);
}
}
执行主函数得到下面的结果:
这里就生成完了,解密也执行完了,利用jwt一般是进行Api的开发,对安全性较高的系统推荐重新设置一套加密规则,本篇文章只是对jwt的运用做一个说明。
如果有不足的地方请大家指出,谢谢。