

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 使用 Application Load Balancer 驗證 JWTs
<a name="listener-verify-jwt"></a>

您可以設定 Application Load Balancer (ALB) 來驗證用戶端提供的 JSON Web Token (JWT)，以進行安全service-to-service(S2S) machine-to-machine(M2M) 通訊。無論 JWT 的發出方式為何，負載平衡器都可以驗證 JWT，無需人為互動。

 ALB 將驗證字符簽章，並需要兩個強制性宣告：'iss' （發行者） 和 'exp' （過期）。此外，如果字符中存在，ALB 也會驗證 'nbf' （而不是之前） 和 'iat' （在時間發出） 宣告。您最多可以設定 10 個額外的宣告進行驗證。這些宣告支援三種格式：
+ 單一字串：單一文字值
+ 空格分隔值：以空格分隔的多個值 （最多 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，並在每個請求中將其轉送至 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. 在 [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) 開啟 Amazon EC2 主控台。

1. 在導覽窗格的 **Load Balancing (負載平衡器)**，選擇 **Load Balancer (負載平衡器)**。

1. 選取您的 Application Load Balancer，然後選擇**接聽程式**索引標籤。

1. 選取 HTTPS 接聽程式，然後選擇**管理規則**。

1. 選擇**新增規則**。

1. （選用） 若要指定規則的名稱，請展開**名稱和標籤**，然後輸入名稱。若要新增其他標籤，請選擇**新增其他標籤**，然後輸入標籤索引鍵和標籤值。

1. 在**條件**下，定義 1-5 個條件值

1. （選用） 若要新增轉換，請選擇**新增轉換**、選擇轉換類型，然後輸入要比對的規則運算式和替代字串。

1.  針對**動作、預先路由**動作，選擇**驗證字符。**

   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 驗證 。

使用 動作建立接聽程式規則來驗證 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`動作和 `forward`動作的 `actions.json` 檔案範例。請依照身分提供者提供的文件來判斷受支援的欄位 

```
--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)。