本文参考的是jjwt官方github,链接在此,本文会持续跟进jjwt的最新版本
GitHub - jwtk/jjwt: Java JWT: JSON Web Token for Java and Android
简介
JJWT(Java JWT)是Java平台上相当流行的用于生成Json Web Token的库,其更新速度非常快,导致网上许多教程在如今看来都已经过时。本文将对最新的JJWT官方github页进行个人的中文解释,力求做到与官方同步。
名词解释
JWT | Java Web Token 一种通用的基于文本的信息传递格式,可用于传递任意类型的数据 |
JWS | JSON Web Signature 对JSON数据结构进行签名的标准,用于确保数据完整和来源的真实性 |
JWE | JSON Web Encryption 对JSON数据结构进行加密的标准,用于确保数据的机密性 |
JWS和JWE的区别在于,
- JWS中的数据是可以被任何人查看的,其只能够保证信息在传递过程中未被篡改;
- JWE则保护了数据不被未授权方查看,也能够保证信息未被篡改,因此数据涉及到隐私时应当使用JWE。
声明(Claim)
在许多场景下,开发者习惯使用JSON的负载(payload)来表示用户或主机或其他的身份概念的数据。这种情况下的负载(payload)就称为声明(Claim)。大家常用的比如说用户名/ip地址等都可以归属到声明之中。
标准声明(standard claim)
在RFC7519标准中,存在着数个标准声明(standard claim)。这些Claims并非强制性要求。JJWT为每一个标准声明都提供了方便的构造方法。例如subject()
、iss()
等方法。标准声明表:
issuer
: sets the iss(Issuer) Claimsubject
: sets the sub(Subject) Claimaudience
: sets the aud(Audience) Claimexpiration
: sets the exp(Expiration Time) ClaimnotBefore
: sets the nbf(Not Before) ClaimissuedAt
: sets the iat(Issued At) Claimid
: sets the jti(JWT ID) Claim
自定义声明(Custom Claims)
毫无疑问,jjwt也是支持自定义声明的,使用Claim()
方法即可在payload中插入自己想要的键值对
快速开始
使用JJWT进行JWS生成
// key生成部分
SecretKey key = Jwts.SIG.HS256.key().build();//jws生成部分
String jws = Jwts.builder().subject("Joe").claim("name","Mike") .claim("address","Beijing").signWith(key).compact();
key生成部分
首先SecretKey key = Jwts.SIG.HS256.key().build();
进行调试可以看到,生成的是一个SecertKey对象,包含两个属性:key
和algorithm
,key
是随机生成的一个HMAC密钥,algorithm
则说明当前使用的签名算法。需要保管好这个key,后续的jws解析也需要用到它.
jws生成部分
然后是jws生成部分上文生成的的jws是一条JWS,
.claim("name","Mike")
指payload中新增一条"name":"Mike"的键值对
.claim("address","Beijing")
用于指出claim()
方法是可以多次重复使用的
.subject("Joe")
指payload中的键sub的值为"Joe"
.signWith(key)
指使用生成的key进行签名
.compact()
指将其压缩为String格式
使用JJWT进行JWS解析
// jws解析
Jws<Claims> claims= Jwts.parser().verifyWith(key).build().parseSignedClaims(jws);System.out.println(claims.getPayload().get("sub"));
System.out.println(claims.getPayload().get("name"));
System.out.println(claims.getPayload().get("address"));
.verifyWith(key)
指的是选用解析jws用的key,上面用过,此处调用即可
.paraseSignedClaims(jws)
指选用jws这个字符串进行解析
得到一个Jws<Claims>类型的对象claims
claims.getPayload().get("sub")
指从payload中获取键"sub"对应的值,另外两个亦然
未完待续....