auth0-JWT
jwt构成
- header:包含生成token使用的算法与token类型
- payload:数据载体,可以有自定义数据
- verify signature:签名验证
使用流程
- 用户提交用户名+密码,服务器使用jwt创建token并返回
- 用户后续请求携带token
- 服务端将token分割开
- 对第二段进行解码获取payload
- 检查payload中的数据是否过期
- 为了保证前两段数据没有被纂改,需要校验第三代数据
- 将第一、二端字符串拼接,进行hs256
- 用生成的密文与第三段进行比较
jwt官方字段
- iss(issuer):发布者
- sub(subject):主题
- iat(issued at):生成签名的时间
- exp(expiration time):签名过期时间
- aud(audience):接收者
- nbf(not before):生效时间
- jti(jwt id):编号
创建
Algorithm secret = Algorithm.HMAC256("secret");//secret为密钥
String token = JWT.create()
.withIssuer("auth0")//发布者
.withIssuedAt(date)//签名时间
.withExpiresAt(time)//签名有效时间
.withClaim("name", "zhangsan")//数据
.sign(secret);
- 使用create方法创建Builder
- 使用withXXX()方法设置字段值
- 最后调用sign生成token字符串
sign前有几个with,第二段解密后就有几条数据
验证
Algorithm algorithm = Algorithm.HMAC256("secret");
JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0") //指定token发布者
.build();
DecodedJWT jwt = verifier.verify(token);//解码jwt
System.out.println(jwt.getIssuer());
System.out.println(jwt.getPayload());
Map<String, Claim> claims = jwt.getClaims();
Claim name = claims.get("name");
System.out.println(name.asString());
System.out.println(claims.get("iss").asString());
- 使用require创建Builder
- 使用withXXX设置验证条件
- 调用build生成JWTVerifier
- 调用JWTVerifier的verify方法解码jwt,生成DecodedJWT
- 使用DecodedJWT的getXXX方法获取字段值,或使用getClaims获取所有字段的map
Claim类
Claim类是claim的包装类,允许将claim转为不同类型
方法 | 返回类型 |
---|---|
asBoolean | 布尔 |
asInt | integer |
asDouble | double |
asLong | long |
asString | string |
asDate | 日期 |
如果无法转换返回null
解码
DecodedJWT jwt = JWT.decode(token);
System.out.println(jwt.getIssuer());//获取发布者
System.out.println(jwt.getAlgorithm());//获取算法类型
System.out.println(jwt.getType());//获取token类型
- 通过decode解码token并获得DecodedJWT对象