AUTH0-JWT

Author Avatar
丁起男 09月 10,2020
  • 在其它设备中阅读本文章

auth0-JWT

jwt构成

  • header:包含生成token使用的算法与token类型
  • payload:数据载体,可以有自定义数据
  • verify signature:签名验证

使用流程

  1. 用户提交用户名+密码,服务器使用jwt创建token并返回
  2. 用户后续请求携带token
  3. 服务端将token分割开
  4. 对第二段进行解码获取payload
  5. 检查payload中的数据是否过期
  6. 为了保证前两段数据没有被纂改,需要校验第三代数据
    1. 将第一、二端字符串拼接,进行hs256
    2. 用生成的密文与第三段进行比较

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布尔
asIntinteger
asDoubledouble
asLonglong
asStringstring
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对象