

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

# 來自 API Gateway Lambda 授權方的輸出
<a name="api-gateway-lambda-authorizer-output"></a>

Lambda 授權方函數的輸出是類似字典的物件，其中必須包含主要識別符 (`principalId`) 以及列出政策陳述式的政策文件 (`policyDocument`)。此輸出也可包含由鍵值對組成的 `context` 對應。如果 API 使用用量計劃 ([https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource](https://docs.aws.amazon.com/apigateway/latest/api/API_RestApi.html#apiKeySource) 設為 `AUTHORIZER`)，Lambda 授權方函數必須傳回其中一個用量計劃的 API 金鑰做為 `usageIdentifierKey` 屬性值。

以下示範此輸出。

------
#### [ JSON ]

****  

```
{
  "principalId": "yyyyyyyy", 
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Allow|Deny",
        "Resource": "arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]"
      }
    ]
  },
  "context": {
    "stringKey": "value",
    "numberKey": "1",
    "booleanKey": "true"
  },
  "usageIdentifierKey": "{api-key}"
}
```

------

 在本例中，政策陳述式會指定要允許或拒絕 (`Effect`) API Gateway 執行服務呼叫 (`Action`) 指定的 API 方法 (`Resource`)。您可能需要根據您的授權方來控制對多個資源的存取。您可以使用萬用字元 (`*`) 來指定資源類型 (方法)。如需設定有效政策來呼叫 API 的資訊，請參閱「[在 API Gateway 中執行 API 之 IAM 政策的陳述式參考](api-gateway-control-access-using-iam-policies-to-invoke-api.md#api-gateway-calling-api-permissions)」。

針對啟用授權的方法 ARN (例如 `arn:aws:execute-api:{regionId}:{accountId}:{apiId}/{stage}/{httpVerb}/[{resource}/[{child-resources}]]`)，長度上限為 1600 位元組。路徑參數值是在執行時間所決定的大小，可能會導致 ARN 長度超過限制。發生此情況時，API 用戶端會收到 `414 Request URI too long` 回應。

此外，授權方之政策陳述式輸出中所示的資源 ARN 長度目前限制為 512 個字元。因此，您不得在請求 URI 中，使用 JWT 字符長度很長的 URI。反之，您可以在請求標頭中安全傳遞此 JWT 字符。

 您可以使用 `principalId` 變數，來存取對應範本中的 `$context.authorizer.principalId` 值。如果您想要將此值傳遞到後端，這會很有用。如需詳細資訊，請參閱 [資料轉換的內容變數](api-gateway-mapping-template-reference.md#context-variable-reference)。

 您可以分別呼叫 `stringKey`、`numberKey` 或 `booleanKey`，來存取對應範本中 `"value"` 對應的 `"1"`、`"true"` 或 `context` 值 (例如 `$context.authorizer.stringKey`、`$context.authorizer.numberKey` 或 `$context.authorizer.booleanKey`)。傳回的值全部都已字串化。請注意，您無法將 JSON 物件或陣列設定為 `context` 對應中任何金鑰的有效值。

 您可以透過整合請求對應範本，使用 `context` 對應將快取的登入資料從授權方傳回後端。這可讓後端使用快取的登入資料來降低存取秘密金鑰的需求，並開啟每個請求的授權字符，藉此提供改善的使用者體驗。

 對於 Lambda 代理整合，API Gateway 會將 `context` 物件從 Lambda 授權方直接傳遞至後端 Lambda 函式，做為輸入 `event` 的一部分。您可以呼叫 `$event.requestContext.authorizer.key`，來擷取 Lambda 函數中的 `context` 索引鍵/值組。

API 階段用量計劃中，`{api-key}` 代表 API 金鑰。如需詳細資訊，請參閱 [API Gateway 中 REST API 的用量計畫和 API 金鑰](api-gateway-api-usage-plans.md)。

 以下顯示範例 Lambda 授權方的範例輸出。範例輸出包含政策陳述式，可針對 AWS 帳戶 (`Deny`) 的 API () `dev`階段封鎖 (`ymy8tbxw7b`) 對 `GET` 方法的呼叫`123456789012`。

------
#### [ JSON ]

****  

```
{
  "principalId": "user",
  "policyDocument": {
    "Version":"2012-10-17",		 	 	 
    "Statement": [
      {
        "Action": "execute-api:Invoke",
        "Effect": "Deny",
        "Resource": "arn:aws:execute-api:us-west-2:123456789012:ymy8tbxw7b/dev/GET/"
      }
    ]
  }
}
```

------