

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

# JWTs 使用 Application Load Balancer 进行验证
<a name="listener-verify-jwt"></a>

您可以配置 Application Load Balancer (ALB) 来验证客户端为安全 service-to-service (S2S) 或 (M2M) 通信提供的 JSON Web 令牌 machine-to-machine (JWT)。无论JWT是如何发布的，负载均衡器都可以在无需人为干预的情况下对其进行验证。

 ALB 将验证令牌签名，并需要两个强制声明：“iss”（发行者）和 “exp”（到期）。此外，如果代币中存在，ALB 还将验证 “nbf”（不是之前）和 “iat”（当时发行）的索赔。您最多可以配置 10 个额外的索赔进行验证。这些索赔支持三种格式：
+ 单字符串：单个文本值
+ 以空格分隔的值：用空格分隔的多个值（最多 10 个值）
+ 字符串数组：文本值数组（最多 10 个值）

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

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

完成以下任务：

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

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

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

1. 在请求标头中包含 JWT，并在每个请求中将其转发给 Application Load Balancer。注意：仅支持该 RS256 算法

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

在 Application Load Balancer 中使用 JWT 验证时，JWKS（JSON Web 密钥集）端点必须满足以下要求：
+ **最大响应大小**：150 KB
+ **最大按键数**：10 把钥匙

如果您的身份提供商发出的 JWKS 响应超过上述任一限制，Application Load Balancer 将不会将请求转发到您的后端目标。

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

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

1. 打开 Amazon EC2 控制台控制台，网址为[https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/)。

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

1. 选择您的 Application Load Balancer，然后选择 Li **steners** 选项卡。

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

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

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

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

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

1.  对于 “**操作”、“路由前**操作”，选择 “**验证令牌**”。

   1.  对于 **JWKS 端点**，请输入您的 JSON Web 密钥集端点的网址。此端点必须可公开访问，并返回用于验证 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 验证。

创建带有要验证的操作的侦听器规则 JWTs。监听器必须是 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)。