

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

# 管理使用者集區字符過期和快取
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens"></a>

每次您想要獲取新的 JSON Web 權杖 (JWT) 時，您的應用程式都必須成功完成以下請求之一。
+ 從[權杖端點](token-endpoint.md)請求用戶端憑證或授權碼[授與](https://www.rfc-editor.org/rfc/rfc6749#section-1.3)。
+ 從受管登入頁面請求隱含授予。
+ 在 Amazon Cognito API 請求 (例如 [InitiateAuth](https://docs.aws.amazon.com/cognito-user-identity-pools/latest/APIReference/API_InitiateAuth.html)) 中驗證本機使用者。

您可以設定使用者集區，將權杖設定為在幾分鐘、幾小時或幾天後過期。為了確保應用程式的效能和可用性，請在字符生命週期的大約 75% 內使用 Amazon Cognito 字符，然後才擷取新的字符。您為應用程式建立的快取解決方案可讓權杖保持可用，並在請求率過高時防止 Amazon Cognito 拒絕請求。用戶端應用程式必須將權杖儲存在記憶體快取中。伺服器端應用程式可以新增加密的快取機制來儲存權杖。

當您的使用者集區產生大量的使用者或機器對機器活動時，您可能會遇到 Amazon Cognito 針對您可發出的權杖請求數量設定的限制。為了減少對 Amazon Cognito 端點發出的請求數量，您可以安全地存放和重複使用驗證資料，或實施指數退避和重試。

驗證資料來自兩種端點類別。Amazon Cognito [OAuth 2.0 端點](https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-userpools-server-contract-reference.html)包含權杖端點，該端點服務用戶端憑證和受管登入授權碼請求。[服務端點](https://docs.aws.amazon.com/general/latest/gr/cognito_identity.html#cognito_identity_your_user_pools_region)會回答使用者集區 API 請求，如 `InitiateAuth` 和 `RespondToAuthChallenge`。每種類型的請求都有自己的限制。如需限制的詳細資訊，請參閱 [Amazon Cognito 的配額](quotas.md)。

## 使用 Amazon API Gateway 快取機器對機器存取權杖
<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway"></a>

透過 API Gateway 權杖快取，您的應用程式可以擴展以回應大於 Amazon Cognito OAuth 端點預設請求率配額的事件。

![\[維護 M2M 存取字符快取的 API Gateway 圖表。API 代理會處理字符請求，如果快取字符已經有效，則傳回快取字符。\]](http://docs.aws.amazon.com/zh_tw/cognito/latest/developerguide/images/user-pools-m2m-caching.png)


您可以快取存取權杖，以便您的應用僅在快取權杖過期時請求新的存取權杖。否則，您的快取端點會從快取傳回權杖。如此可防止額外呼叫 Amazon Cognito API 端點。當您使用 Amazon API Gateway 作為 [權杖端點](token-endpoint.md) 的代理時，您的 API 會回應大部分請求，否則請求會佔用配額，以避免因為速率限制導致請求失敗。

以下 API Gateway 解決方案提供低延遲、低程式碼/無程式碼的權杖快取實作。API Gateway API 在傳輸過程中進行加密，並可選擇是否在靜態時加密。API Gateway 快取是 OAuth 2.0 的[用戶端憑證授與](https://datatracker.ietf.org/doc/html/rfc6749#section-4.4)的理想選擇，一種頻繁的大容量授與類型，可產生存取權杖以授權機器對機器和微服務工作階段。如果流量激增導致您的微服務水平擴展，您可以在超過使用者集區或應用程式用戶端 AWS 請求速率限制的磁碟區中使用相同的用戶端登入資料，最終會有許多系統。為了保持應用程式可用性和低延遲，快取解決方案是在這種情況下的最佳做法。

在此解決方案中，您可以在 API 中定義快取，以為要在應用程式中請求的每個 OAuth 範圍和應用程式用戶端組合儲存單獨的存取權杖。當您的應用程式發出符合快取金鑰的請求時，您的 API 會以 Amazon Cognito 對符合快取金鑰的第一個請求發出的存取權杖進行回應。當您的快取金鑰持續時間過期時，您的 API 將請求轉發到權杖端點並快取新的存取權杖。

**注意**  
您的快取金鑰持續時間必須短於應用程式用戶端的存取權杖持續時間。

快取金鑰是您在請求內文的 `scope` 參數中請求的 OAuth 範圍和請求中的 `Authorization`標頭的組合。`Authorization` 標題包含您的應用程式用戶端 ID 和用戶端密碼。您無需在應用程式中實作其他邏輯即可實現此解決方案。您只能更新組態以變更使用者集區權杖端點的路徑。

您也可以使用 [ElastiCache (Redis OSS)](https://docs.aws.amazon.com/elasticache/index.html) 實作權杖快取。如需使用 AWS Identity and Access Management (IAM) 政策進行精細控制，請考慮 [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/authentication-and-access-control.html#authentication) 快取。

**注意**  
API Gateway 中的快取需支付額外費用。[如需詳細資訊，請參閱定價。](https://aws.amazon.com/api-gateway/pricing)<a name="amazon-cognito-user-pools-using-tokens-caching-tokens-API-gateway-how-to"></a>

**使用 API Gateway 設定快取代理**

1. 開啟 [API Gateway 主控台](https://console.aws.amazon.com/apigateway/main/apis)並建立 REST API。

1. 在 **Resources** (資源) 中，建立 POST 方法。

   1. 選擇 HTTP **Integration type** (整合類型)。

   1. 選擇 **Use HTTP proxy integration** (使用 HTTP 代理整合)。

   1. 輸入 `https://<your user pool domain>/oauth2/token` 的 **Endpoint URL** (端點 URL)。

1. 在 **Resources** (資源) 中，設定快取金鑰。

   1. 編輯您 POST 方法的 **Method request** (方法請求)。
**注意**  
此方法請求驗證用於字符請求中的`client_secret_basic`授權，其中用戶端秘密在`Authorization`請求標頭中編碼。為了驗證`client_secret_post`授權中的 JSON 請求內文，請改為建立需要 [client\$1secret](token-endpoint.md#post-token-request-parameters-in-body) 存在[的資料模型](https://docs.aws.amazon.com/apigateway/latest/developerguide/models-mappings-models.html)。在此模型中，您的**請求驗證程式**應該**驗證內文、查詢字串參數和標頭**。

   1. 設定 方法 **請求驗證器**以**驗證查詢字串參數和標頭**。如需請求驗證的詳細資訊，請參閱《*Amazon API Gateway 開發人員指南*》中的[請求驗證](https://docs.aws.amazon.com/apigateway/latest/developerguide/api-gateway-method-request-validation.html)。

   1. 設定您的 `scope` 參數和 `Authorization` 標題作為您的快取金鑰。

      1. 將查詢字串新增至 **URL 查詢字串參數**。輸入查詢字串**名稱** `scope`，然後選取**必要**和**快取**。

      1. 將標頭新增至 **HTTP 請求標頭**。輸入 的請求標頭**名稱**`Authorization`，然後選取**必要**和**快取**。

1. 在 **Stages** (階段) 中，設定快取。

   1. 選擇您要修改的階段，然後選擇從**階段詳細資訊****中編輯**。

   1. **在其他設定**、**快取設定**下，開啟**佈建 API 快取**選項。

   1. 選擇 **Cache capacity** (快取容量)。更高的快取容量可改善效能，但需額外付費。

   1. 清除 **需要授權** 核取方塊。選取**繼續**。

   1. API Gateway 只會將快取政策套用至階段層級的 GET 方法。您必須將快取政策覆寫套用至 POST 方法。

      展開您設定的階段，然後選取 `POST`方法。若要為 方法建立快取設定，請選擇**建立覆寫**。

   1. 啟用**啟用方法快取**選項。

   1. 輸入 3600 秒的****快取time-to-live (TTL)****。選擇**儲存**。

1. 在 **Stages** (階段) 中，記下 **Invoke URL** (叫用 URL)。

1. 更新您的應用程式以將權杖請求 POST 到 API 的 **Invoke URL** (叫用網址)，而不是使用者集區的 `/oauth2/token` 端點。