如何在 API Gateway REST API 上將 Amazon Cognito 使用者集區設定為授權者?

3 分的閱讀內容
0

我想在我的 Amazon API Gateway REST API 上設定一個 Amazon Cognito 使用者集區作為授權者。

簡短說明

有兩種方法可以在 API Gateway REST API 上將 Amazon Cognito 使用者集區設定為授權者:

您可以使用 ID 權杖存取權杖進行授權。存取權杖可以使用 Amazon Cognito 中的自訂範圍來授權對 API Gateway API 的存取。Lambda 授權者可以驗證 Amazon Cognito 發行的 ID 權杖和存取權杖中的宣告。

如需詳細資訊,請參閱下列主題:

解決方法

下列程序顯示如何建立 COGNITO\ _USER\ _POOLS 授權者。此範例假設你已經建立了兩件事:

建立 COGNITO_USER_POOLS 授權者

如需詳細資訊,請參閱整合 REST API 與 Amazon Cognito 使用者集區。請依照使用 API Gateway 主控台建立 COGNITO\ _USER\ _POOLS 授權者一節中的指示進行。

測試新的 COGNITO_USER_POOLS 授權者

建立 COGNITO\ _USER\ _POOLS 授權者後,請執行下列動作:

  1. API Gateway 主控台中,選擇新授權者下的測試按鈕。

  2. 測試視窗中,針對授權,輸入來自新 Amazon Cognito 使用者集區的 ID 權杖

3.    選擇 測試

**注意:**如果 ID 權杖正確,則測試會傳回 200 回應代碼。不正確的 ID 權杖則會傳回 401 回應代碼。

採用 API 方法設定 COGNITO_USER_POOLS 授權者

如需詳細資訊,請參閱整合 REST API 與 Amazon Cognito 使用者集區。請遵循採用各種方法設定 COGNITO_USER_POOLS 授權者一節中的指示。

取得授權權杖

取得授權權杖有四種方法:

**注意:**使用授權碼授予方式來設定 Amazon Cognito 託管的 UI,以便您的應用程式可以針對權杖端點交換程式碼。

如果您使用隱含的授予方式類型,則可以透過回呼網址獲獲得授予方式。回呼網址附加了隱含資料流的存取權杖和 ID 權杖參數。請您務必使用正確的權杖類型。

使用 Amazon Cognito 的託管 UI 取得授權權杖權杖

要使用授權碼授予流程,請執行以下動作:

**注意:**使用授權代碼授予流程時,回應類型參數必須是 "code"

  1. 傳送 GET 請求授權碼授予:

**重要事項:**以您的使用者集區的網域名稱取代 example_domain。以您的使用者集區的應用程式用戶端 ID 取代 example_app_client_id。以您的回呼網址取代 example_callback_url

https://example_domain/oauth2/authorize?response_type=code&client_id=example_app_client_id&redirect_uri=example_callback_url

**注意:**包括端點的 identity_provider 參數,以重新導向至聯合身分提供者。如果應用程式用戶端僅針對 Amazon Cognito 使用者集區設定,則下列端點會重新導向至 /login 端點:

https://example_domain/login?response_type=code&client_id=example_app_client_id&redirect_uri=example_callback_url

2.    登入您的使用者集區或聯合身分提供者。使用者介面會重新導向至應用程式用戶端的回呼中所指定的網址。

**重要事項:**重新導向網址包括需要與權杖端點交換以取得有效權杖的授權代碼。

  1. 將 POST 請求傳送至 /oauth2/token 端點以交換權杖的授權代碼。如需詳細資訊,請參閱權杖端點

**範例 POST 請求以交換權杖的授權代碼 **

**注意:**範例 POST 請求使用以下 /oauth2/token 端點:https://example_domain.auth.us-east-1.amazoncognito.com/oauth2/token&

Content-Type='application/x-www-form-urlencoded'&
Authorization=Basic ZXhhbXBsZTEyMzQ1Njc4OTA6enl4OTh3N3l2dHNycTY1NHBvMzIx
grant_type=authorization_code&
client_id=example1234567890&
code=AUTHORIZATION_CODE&
redirect_uri=com.myclientapp://myclient/redirect

範例 POST 請求回應

HTTP/1.1 200 OK
Content-Type: application/json

{
  "access_token":"abCde1example",
  "id_token":"abCde2example",
  "refresh_token":"abCde3example",
  "token_type":"Bearer",
  "expires_in":3600
}

若要使用隱含授予流程,請執行下列動作:

注意:使用隱含授予流程時,回應類型參數必須是"token"

  1. 針對隱含授予傳送一個 GET 請求:

**重要事項:**以您的使用者集區的網域名稱取代 example_domain。以您的使用者集區的應用程式用戶端 ID 取代 example_app_client_id。以您的回呼網址取代 example_callback_url

https://example_domain/oauth2/authorize?response_type=token&client_id=example_app_client_id&redirect_uri=example_callback_url

**注意:**包括端點的 identity_provider 參數,以重新導向至聯合身分提供者。如果應用程式用戶端僅針對 Amazon Cognito 使用者集區設定,則下列端點會重新導向至 /login 端點:

https://example_domain/login?response_type=token&client_id=example_app_client_id&redirect_uri=example_callback_url
  1. 使用現有使用者的使用者名稱和密碼登入您的使用者集區,或建立新的使用者以進行登入。使用者介面會重新導向至應用程式用戶端的回呼中所指定的網址。

注意:重新導向網址包括 ID 權杖存取權杖

重新導向網址範例

https://www.example.com/#id_token=123456789idtoken123456789&access_token=123456789accesstoken123456789expires_in=3600&token_type=Bearer

使用 AWS CLI 取得授權權杖

注意: 如果您在執行 AWS CLI 命令時收到錯誤,請確定您使用的是最新版本的 AWS CLI

執行以下的 initiate-auth AWS CLI 命令以取得授權權杖:

**重要事項:**以您的使用者名稱取代 example_user,接著以您的密碼取代 example_password,然後以您的應用程式用戶端 ID 取代 example_app_client_id

aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=example_user,PASSWORD=example_password --client_id example_app_client_id

範例 initiate-auth AWS CLI 命令回應

{
  "AuthenticationResult": {
    "AccessToken": "abCde1example",
    "IdToken": "abCde2example",
    "RefreshToken": "abCde3example",
    "TokenType": "Bearer",
    "ExpiresIn": 3600
  },
  "ChallengeParameters": {}
}

使用其中一個 AWS SDK 取得授權權杖

如需詳細資訊,請參閱整合 Amazon Cognito 與網路和行動應用程式

使用 Postman 取得授權權杖

使用 Postman中的 OAuth 2.0 授權模式來取得授權權杖。如需詳細資訊,請參閱為什麼在建立 Lambda 授權者之後收到 API Gateway 401 未經授權的錯誤?

在 Amazon Cognito 使用者集區中設定 OAuth 2.0 自訂範圍,並在 API Gateway 中驗證範圍

範圍提供應用程式可以要求資源的存取層級。Amazon Cognito 具有內建的 OAuth 範圍,可加以設定以允許應用程式用戶端與使用者集區建立關聯。如需 Amazon Cognito 中內建範圍的詳細資訊,請參閱應用程式用戶端設定術語

自訂範圍可以與 OAuth 2.0 資源伺服器建立關聯。如需有關資源伺服器的詳細資訊,請參閱定義使用者集區的資源伺服器

當您將搭配 API Gateway 使用 Amazon Cognito 時,Amazon Cognito 授權者會驗證請求並確保資源安全。搭配 Amazon Cognito 和 API Gateway 使用自訂範圍,可協助您提供不同層級的 API 資源存取權限。在公開資源以存取權杖範圍時,您還可以獲得更多控制權。

**在使用者集區中設定資源伺服器與 OAuth 2.0 自訂範圍 **

  1. 為您的使用者集區定義資源伺服器與自訂範圍
    對於資源伺服器識別符,請提供資源所在之 API Gateway 的 HTTPS 端點。

  2. 如有必要,請設定使用者集區應用程式用戶端,然後在應用程式用戶端設定中新增自訂範圍。

**注意:**自訂範圍名稱格式採用以下格式: resourceServerIdentifier/scopeName

當用戶端應用程式在 OAuth 2.0 流程中請求自訂範圍時,用戶端應用程式必須請求範圍的完整識別符。例如,如果資源伺服器識別符為 https://myresourceserver.example.com,而範圍名稱是 resources.read,則用戶端應用程式必須在執行階段要求 https://myresourceserver.example.com/resources.read

驗證 API Gateway 中的 OAuth 2.0 自訂範圍

  1. 整合 REST API 與 Amazon Cognito 使用者集區

  2. API Gateway 主控台中,選擇一個 REST API。

  3. 資源窗格中,選擇方法名稱。

  4. 選擇方法請求組態。

  5. 授權下拉式清單中,選擇 Cognito 授權者。這會自動新增一個名稱為 OAuth 範圍的新欄位。

  6. OAuth 範圍欄位中,以先前提到的格式輸入自訂範圍的完整識別符。例如,**https://myresourceserver.example.com/resources.read **。

  7. 儲存並部署 API。

**使用 Postman 或 CURL 測試設定 **

  1. 使用針對用戶端定義的其中一個 OAuth 2.0 流程,從 Amazon Cognito 授權伺服器取得存取權杖。

  2. 將收到的存取權杖作為請求的授權標頭,傳送至 API Gateway。

  3. 如果一切順利,而且 API Gateway 驗證並確認存取權杖和自訂範圍,那麼您將收到 200 OK 回應。

相關資訊

使用 Amazon Cognito 聯合身分識別、Amazon Cognito 使用者集區和Amazon API Gateway 確保 API 存取權

如何解碼和確認 Amazon Cognito JSON Web 權杖的簽章?

使用 Amazon Cognito 使用者集區做為授權者,控制對 REST API 的存取

AWS 官方
AWS 官方已更新 3 年前