2.10.2. 配置 JSON Web 令牌(JWT)身份验证

您可以通过在 elytron 子系统 中指定令牌 域来启用对 JWT 的支持。

token-realm 中,您可以指定属性和 jwt 令牌验证器。Elytron 完成以下检查:

  • 自动过期检查 exp 声明和 nbf 声明中指定的值。
  • 可选:根据以下方法之一提供的公钥进行签名检查:

    • 使用 公钥或 证书 属性.
    • 使用带命名公钥的密钥映射.
    • 使用 client-ssl-context 属性从 jku claim 中指定的 URL 检索远程 JSON Web 密钥(JWK)。
  • 可选:检查 JWT,以确保它只包含 支持的值和 aud 声明。您可以使用 签发 者和使用者 属性来执行这些检查。

下例演示了 token-realm 作为安全域,而 principal-claim 作为属性。principal-claim 属性定义 elytron 用于 获取主体名称的声明的名称。jwt 元素指定令牌必须被验证为 JWT。

配置的 token-realm示例

<token-realm name="${token_realm_name}" principal-claim="${principal_claim_key}">
    <jwt issuer="${issuer_name}"
         audience="${audience_name}"
         <public-key="${public_key_in_PEM_format}"/>
 </token-realm>

您可以为您的 token-realm 定义密钥映射。然后,您可以使用不同的密钥对来验证签名并轻松地轮转这些密钥对。Elytron 从令牌获取一名 孩子 索赔,并使用对应的公钥进行验证。

  • 如果 JWT 中不存在 孩子 声明,则 token-realm 使用 jwtpublic-key 属性中指定的值来验证签名。
  • 如果 JWT 中不存在 孩子 声明,并且您尚未配置 公钥,则 token -realm 将使令牌失效。

token-realm 配置的密钥映射示例。

<token-realm name="${token_realm_name}" principal-claim="${principal_claim_key}">
    <jwt issuer="${issuer_name}" audience="${audience_name}">
        <key kid="${key_ID_from_kid_claim}" public-key="${public_key_in_PEM_format}"/>
        <key kid="${another_key_ID_from_kid_claim}" public-key="${public_key_in_PEM_format}"/>
    </jwt>
</token-realm>

流程

  1. 使用 keytool 创建密钥存储

    使用 keytool 创建密钥存储 的示例:

    keytool -genkeypair -alias <alias_name> -keyalg <key_algorithm> -keysize <key_size> -validity <key_validity_in_days> -keystore <key_store_path> -dname <distinguished_name> -keypass <key_password> -storepass  <key_store_password>

    接下来,在 elytron 子系统中添加 密钥存储 定义。

    elytron 子系统中添加 密钥存储 定义的示例:

    /subsystem=elytron/key-store=<key_store_name>:add(path=<key_store_path> , credential-reference={clear-text=<key_store_password>}, type=<keystore_type>)

  2. elytron 子系统中创建 token-realm,并为您的 token-realm 指定属性和 jwt 令牌验证器。

    elytron 子系统中创建 令牌域 的示例:

    /subsystem=elytron/token-realm=<token_realm_name>:add(jwt={issuer=[<issuer_name>],audience=[<audience_name>],key-store=<key_store_name>,certificate=<alias_name>},principal-claim=<principal_claim_key>)

其他资源