Java jwt : jsonwebtokenforjavaandandroidjjwt是一个在JVM上创建和验证JSONwebtoken(jwts )的库。
JWT是基于JWT、JWS、JWE、JWK和JWA RFC规范的Java实现。
该库由Okta的Les Hazlewood创建,目前由贡献者社区维护。
JSON Web Token JWT是一种在两者之间传输信息的方法。
在JWT主体中编码的信息称为claims。 由于JWT的扩展格式是JSON格式,因此每个claim都是JSON对象的密钥。
JTS将签名加密(设为JWS )或加密(设为JWE )。
这将提高JWTs的验证性。 例如,收件人可以通过验证签名来确保JWT没有被篡改。
生成的JWT结果是由“.”分隔的包含三个部分的字符串。
例如:
eyjhbgcioijiuzi1nij9. eyjzdwiioijkb2uifq.ipevrnurp 6h flg8cfknmuptyprurc 4f B1 dw toll 62sy
每个部分都用base 64编码。
第一部分是头,需要指定用于签名JWT的算法。
eyJhbGciOiJIUzI1NiJ9
第二部分是body。 此部分包含JWT编码的所有声明。
eyJzdWIiOiJKb2UifQ
最后一部分是signature。 根据头文件中指定的算法通过header和body的组合进行计算。
ipevrnurp 6h flg8cfknmuptyprurc 4f B1 dw toll 62sy
用基本的64解码器传递前两部分,可以得到:
header { ‘ alg ‘ : ‘ hs 256 ‘ } body { ‘ sub ‘ : ‘ jzdjb ‘ }复制代码。 在这种情况下,请使用sha – 256算法的HMAC对JWT进行签名。 而且,body有claim sub和value jzdjb。
注册类包括几个标准类,sub是其中之一。
要计算签名,必须知道签名的sercrect。
安装Maven:
ependencygroupidio.jsonwebtoken/groupidartifactidjwt/artifactidversion 0.9.0/version/dependency复制代码Gradle:
dependencies { compile ‘ io.jsonwebtoken : jjwt :0.9.0 ‘ }复制代码Note:JJWt依赖于Jackson 2.x。
如果依赖帅牛的旧版本,则需要将项目版本更新为新版本。 否则,就会发生冲突。
dependency groupIdcom.fasterxml .帅牛. core/groupId artifactId帅牛- databind/artifactidversion 2.8.9/version /
import io.jsonwebtoken.Jwts; import io.jsonwebtoken.signature algorithm; import io.jsonwebtoken.impl.crypto.MAC provider; import java.security.Key; //We need a signing key, sowe ‘ llcreateonejustforthisexample.usually//thekeywouldbereadfromyourapplicationconfigurationinnition stringcompactjws=jwts.builder (.set subject ) ‘ jzdjb ‘.sign key ).compact ) ) ) ) ) ) ) )在以上示例中,复制代码将已注册的claim的sub(subject )设置为jzdjb,然后使用sha – 512算法在HMAC中注册JWT 最后,转换为字符串格式。
eyjhbgcioijiuzuxmij9. eyjzdwiioijkb2uifq.yi v1 gwdrqyceooswytf _ xvlgsnavvvyjm0mu6 rk Mr bf2 t1 MBL 3x H2 kzii0q9bdx5- g0j 25 q v2 w F4 la
资产管理器
t Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws).getBody().getSubject().equals(“jzdjb”);复制代码
这里有两个时间。之前的密钥被用来验证JWT的签名。如果未能验证JWT,则抛出一个签名异常。假设JWT已被验证,我们将解析claim并断言该sub被设置为jzdjb。
但如果签名验证失败了怎么办?可以捕获签名异常并做出相应的反应:
try { Jwts.parser().setSigningKey(key).parseClaimsJws(compactJws); //OK, we can trust this JWT} catch (SignatureException e) { //don’t trust the JWT!}复制代码 支持的特性 兼容的规范 创建和解析明文压缩JWTs创建、解析和验证所有标准JWS算法的数字签名JWTs(又称JWSs): HS256: HMAC using SHA-256HS384: HMAC using SHA-384HS512: HMAC using SHA-512RS256: RSASSA-PKCS-v1_5 using SHA-256RS384: RSASSA-PKCS-v1_5 using SHA-384RS512: RSASSA-PKCS-v1_5 using SHA-512PS256: RSASSA-PSS using SHA-256 and MGF1 with SHA-256PS384: RSASSA-PSS using SHA-384 and MGF1 with SHA-384PS512: RSASSA-PSS using SHA-512 and MGF1 with SHA-512ES256: ECDSA using P-256 and SHA-256ES384: ECDSA using P-384 and SHA-384ES512: ECDSA using P-521 and SHA-512 增强的规范 body压缩。如果JWT体大,可以使用压缩解码器来压缩它。最重要的是,JJWT库将自动解压并解析JWT,而不需要额外的编码。String compactJws = Jwts.builder() .setSubject(“jzdjb”) .compressWith(CompressionCodecs.DEFLATE) .signWith(SignatureAlgorithm.HS512, key) .compact();复制代码
如果检查Jws的header部分,它就会对这个进行解码:
{ “alg”: “HS512”, “zip”: “DEF”}复制代码
JJWT自动检测到压缩是通过检查头来使用的,并且在解析时将自动解压。对于解压缩,不需要额外的编码。
要求claims。在解析时,您可以指定某些断言必须存在并设置为某个值。 try { Jws<Claims> claims = Jwts.parser() .requireSubject(“jzdjb”) .require(“hasMotorcycle”, true) .setSigningKey(key) .parseClaimsJws(compactJws);} catch (MissingClaimException e) { // we get here if the required claim is not present} catch (IncorrectClaimException e) { // we get here if the required claim has the wrong value}复制代码 Registered Claim
所有的claim是可选的,并且是大小写敏感的。
1. “iss” (Issuer) Claim
“iss” (issuer)是签发该证书的负责人。
2. “sub” (Subject) Claim
“sub” (Subject)是主体。
3. “aud” (Audience) Claim
“aud” (Audience) Claim是指jwt的接受者,假如aud没有发现,则解析jwt时会抛出异常
4. “exp” (Expiration Time) Claim
“exp” (Expiration Time)指的是过期时间,假如超过过期时间,则会抛出异常
5. “nbf” (Not Before) Claim
“nbf” (Not Before) Claim指的是开始日期,claim要求当前日期/时间必须在以后或等于
在“nbf”声明中列出的日期/时间
6. “iat” (Issued At) Claim
“iat” (Issued At) Claim是指jwt的发行时间
7. “jti” (JWT ID) Claim
“jti” (JWT ID) Claim为JWT提供了惟一的标识符,如果应用程序
使用多个发行者,必须在值之间避免冲突,
由不同的发行商制作。