

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用应用程序负载均衡器验证 JWT
<a name="listener-verify-jwt"></a>

您可以配置应用程序负载均衡器 (ALB) 来验证客户端为安全服务对服务 (S2S) 或机器对机器 (M2M) 通信提供的 JSON 网络令牌 (JWT)。不管 JWT 是如何发布的，负载均衡器都可以对其进行验证，无需人为干预。

 ALB 将验证代币签名并要求两项强制性声明：“iss”（发行者）和 “exp”（到期）。此外，如果代币中存在，ALB还将验证 “nbf”（不是之前）和 “iat”（当时发出）索赔。您最多可以配置 10 个额外的索赔进行验证。这些索赔支持三种格式：
+ Single-string: 单个文本值
+ Space-separated 值：由空格分隔的多个值（最多 10 个值）
+ String-array: 文本值数组（最多 10 个值）

如果令牌有效，则负载均衡器将带有令牌的请求按原样转发给目标。否则，服务将拒绝该请求。

## 准备使用 JWT 验证
<a name="validate-access-token-requirements"></a>

完成以下任务：

1. 向 IdP 注册您的服务，IdP 会颁发客户端 ID 和客户端密钥。

1. 单独调用 IdP 以请求访问服务。IdP 使用访问令牌进行响应。该令牌通常是由 IdP 签名的 JWT。

1. 设置 JSON Web 密钥集 (JWKS) 端点。负载均衡器在您配置的已知位置获取 IdP 发布的公钥。

1. 将 JWT 包含在请求标头中，并在每个请求中将其转发到应用程序负载均衡器。注意：仅支持 RS256 算法

## JWT 验证限制
<a name="jwt-validation-limits"></a>

在应用程序负载均衡器中使用 JWT 验证时，JWKS（JSON Web 密钥集）端点必须满足以下要求：
+ **最大响应大小**：150 KB
+ **最大密钥数**：10 个密钥

如果您的身份提供商的 JWKS 响应超出其中一个限制，则应用程序负载均衡器不会将请求转发到您的后端目标。

如果您的身份提供商的 JWKS 端点超过这些限制，请考虑在应用程序代码中实现 JWT 验证，或使用密钥集较小的身份提供商。<a name="configure-jwt-validation-listener-rule"></a>

# 使用控制台配置 JWT 验证
<a name="configure-jwt-validation-listener-rule"></a>

1. 在以下位置打开亚马逊 EC2 控制台控制台[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

1. 在导航窗格上的 **Load Balancing**（负载均衡）下，选择 **Load Balancers**（负载均衡器）。

1. 选择您的应用程序负载均衡器，然后选择**监听器**选项卡。

1. 选择 HTTPS 侦听器，然后选择**管理规则**。

1. 选择**添加规则**。

1. （可选）要为规则指定名称，请展开**名称和标签**，然后输入名称。要添加其他标签，请选择**添加其他标签**，然后输入标签键和标签值。

1. 在 “**条件” 下**，定义 1-5 个条件值

1. （可选）要添加转换，请选择**添加转换**，选择转换类型，然后输入要匹配的正则表达式和替换字符串。

1.  在 “**操作、 Pre-routing**操作” 中，选择 “**验证令牌”。**

   1.  对于 ** JWKS 终端节点**，输入您的 JSON Web 密钥集终端节点的 URL。此端点必须可公开访问，并返回用于验证 JWT 签名的公钥。

   1.  对于**发行者**，在您的 JWT 代币中输入 iss 索赔的预期价值。

   1. （可选）要验证其他索赔，请选择**其他索赔。**

      1.  在 “**索赔名称” 中**，输入要验证的索赔名称。

      1. 对于**格式**，选择索赔值的解释方式：

         1. **单一字符串**：声明必须完全匹配一个指定值。

         1. **字符串数组**：声明必须与数组中的一个值相匹配。

         1. **空格分隔的值**：该声明包含以空格分隔的值，这些值必须包含指定的值。

      1. 在 “**值” 中**，输入索赔的预期值。

      1. 对于其他索赔，请重复此操作（最多 10 项索赔）。

1.  对于**操作、路由操作**，选择在成功验证令牌后应执行的主要操作**（转发至、重定向到或返回固定响应）**。

1.  根据需要配置主要操作 

1.  选择**保存**。

## 使用 CLI 配置 JWT 验证
<a name="configure-access-token-validation"></a>

使用以下 [ create-rule ](https://docs.aws.amazon.com/cli/latest/reference/elbv2/create-rule.html) 命令配置 JWT 验证。

使用验证 JWT 的操作创建监听器规则。监听器必须是 HTTPS 监听器。

**注意**  
配置 JWT 验证时，请确保您的 JWKS 终端节点响应的大小不超过 150 KB 或包含超过 10 个密钥。超过这些限制的响应将阻止将请求转发到您的目标。

```
aws elbv2 create-rule \
    --listener-arn {{listener-arn}} \
    --priority {{10}} \
    --conditions Field=path-pattern,Values="{{/login}}" \
    --actions file://actions.json
```

以下是指定`jwt-validation`动作和操作的`actions.json`文件示例。`forward`请按照您的身份提供商提供的文档确定支持的字段 

```
--actions '[
    {
        "Type":"jwt-validation",
        "JwtValidationConfig":{
            "JwksEndpoint":"{{https://issuer.example.com/.well-known/jwks.json}}",
            "Issuer":"{{https://issuer.com}}"
        },
        "Order":1
    },
    {
        "Type":"forward",
        "TargetGroupArn":"{{target-group-arn}}",
        "Order":2
    }
]'
```

以下示例指定了要验证的额外索赔。

```
--actions '[
    {
        "Type":"jwt-validation",
        "JwtValidationConfig":{
            "JwksEndpoint":"{{https://issuer.example.com/.well-known/jwks.json}}",
            "Issuer":"{{https://issuer.com}}",
            "AdditionalClaims":[
              {
                  "Format":"{{string-array}}",
                  "Name":"{{claim_name}}",
                  "Values":["{{value1}}","{{value2}}"]
              }
            ],
        },
        "Order":1
    },
    {
        "Type":"forward",
        "TargetGroupArn":"{{target-group-arn}}",
        "Order":2
    }
]'
```

有关更多信息，请参阅 [Application Load Balancer 的侦听器规则](listener-rules.md)。