【问题标题】:JWT header missing "typ" fieldJWT 标头缺少“类型”字段
【发布时间】:2020-09-21 15:27:37
【问题描述】:

我正在使用以下代码创建 JWT:

long now = Instant.now().getEpochSecond();
long exp = now + TimeUnit.HOURS.toSeconds(1);
long nbf = now - TimeUnit.MINUTES.toSeconds(5);

String jwt = Jwts.builder()
                .setSubject("d45049c3-3441-40ef-ab4d-b9cd86a17225")
                .claim("iss", "d45049c3-3441-40ef-ab4d-b9cd86a17225")
                .claim("aud", "https://apporchard.epic.com/interconnect-aocurprd-oauth/oauth2/token")
                .claim("jti", UUID.randomUUID().toString())
                .claim("exp", exp)
                .claim("nbf", nbf)
                .claim("iat", now)
                .signWith(key, SignatureAlgorithm.RS384)
                .compact();

但是当我查看创建的 JWT 的 JSON 版本时,标题是

{
  "alg": "RS384"
}

它缺少“typ”字段。我认为这个字段是强制性的。

【问题讨论】:

    标签: jjwt


    【解决方案1】:

    typ 标头对于 RFC 7519, Section 5.1 是可选的(粗体强调是我的):

    这是供 JWT 应用程序使用的 当非 JWT 的值也可能出现在应用程序中时 可以包含 JWT 对象的数据结构;该应用程序可以使用 这个值来消除不同类型的对象之间的歧义 可能存在。它通常不会被应用程序使用 已知该对象是 JWT。 这个参数是 被 JWT 实现忽略;该参数的任何处理都是 由 JWT 应用程序执行。

    因此,根据最后的粗体行,JJWT(作为 JWT 实现)不会设置或读取它,因为实现会忽略它。

    如果您愿意,您(如上述白话中的JWT application)可以自己设置值:

    Jwts.builder().setHeaderParam("typ", yourMediaTypeValue)
        ...
    

    但是,正如规范所说,如果您已经知道正在使用 jwt 的字符串,则不需要这样做。只有当 JWT 嵌入到其他内容中并且您需要区分 jwt 和其他内容时,您才真正需要设置该值。

    它通常用于非紧凑(完整 JSON)JWT 文档,而非紧凑 JWS 或 JWE 值,其中完整 JSON 对象需要与其他(非紧凑)JSON 值区分。

    【讨论】:

      猜你喜欢
      • 2016-07-15
      • 1970-01-01
      • 2016-01-11
      • 2017-05-26
      • 2017-07-01
      • 1970-01-01
      • 2011-09-26
      • 2016-03-08
      • 2023-03-29
      相关资源
      最近更新 更多