來自 API Gateway Lambda 授權者的輸出 - Amazon API Gateway

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

來自 API Gateway Lambda 授權者的輸出

Lambda 授權方函數的輸出是類似字典的物件,其中必須包含主要識別符 (principalId) 以及列出政策陳述式的政策文件 (policyDocument)。此輸出也可包含由鍵值對組成的 context 對應。如果 API 使用用量計劃 (apiKeySource 設為 AUTHORIZER),Lambda 授權方函數必須傳回其中一個用量計劃的 API 金鑰做為 usageIdentifierKey 屬性值。

以下示範此輸出。

{   "principalId": "yyyyyyyy", // The principal user identification associated with the token sent by the client. "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 政策的陳述式參考」。

針對啟用授權的方法 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 值。如果您想要將此值傳遞到後端,這會很有用。如需詳細資訊,請參閱 $context資料模型、授權者、對應範本和 CloudWatch 存取記錄的變數

您可以分別呼叫 stringKeynumberKeybooleanKey,來存取對應範本中 "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 金鑰建立及使用用量計劃

以下顯示範例 Lambda 授權方的範例輸出。範例輸出包含一個政策陳述式,用來封鎖 (Deny) 對 AWS 帳號 () dev 階段 API (ymy8tbxw7b) GET 方法的呼叫。123456789012

{ "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/" } ] } }