透過 Amazon Cognito 使用者集區PKCE在授權碼中使用 - Amazon Cognito

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

透過 Amazon Cognito 使用者集區PKCE在授權碼中使用

Amazon Cognito 在授權碼授與中支援代碼交換的證明金鑰 (PKCE) 身份驗證。PKCE是為公共客戶端授予 OAuth 2.0 授權碼的擴展。PKCE防止贖回被截獲的授權碼。

Amazon Cognito 如何使用 PKCE

若要開始驗證PKCE,您的應用程式必須產生唯一的字串值。此字串是程式碼驗證器,Amazon Cognito 用來比較要求初始授權授權給用戶端以交換權杖之授權碼的用戶端的秘密值。

您的應用程序必須將SHA256哈希應用於代碼驗證器字符串,並將結果編碼為 base64。將雜湊字串傳遞給要求主體中的code_challenge參數。授權端點當您的應用程序交換令牌的授權代碼時,它必須包含明文中的代碼驗證程序字符串作為請求主體中的code_verifier參數。權杖端點Amazon Cognito 會在程式碼驗證器上執 hash-and-encode 行相同的作業。Amazon Cognito 僅在判斷程式碼驗證器導致授權請求中收到的相同程式碼挑戰時,才會傳回 ID、存取和重新整理權杖。

若要使用實作授權授權流程 PKCE
  1. 開啟 Amazon Cognito 主控台。如果出現提示,請輸入您的 AWS 認證。

  2. 選擇 User Pools (使用者集區)。

  3. 從清單中選擇現有的使用者集區,或建立使用者集區。如果您建立使用者集區,系統會在精靈期間提示您設定應用程式用戶端並設定託管的 UI。

    1. 如果您建立新的使用者集區,請在引導式設定期間設定應用程式用戶端並設定託管 UI。

    2. 如果您設定現有的使用者集區,請新增網域公用應用程式用戶端 (如果尚未設定)。

  4. 產生隨機的英數字串,通常是通用唯一識別碼 (UUID),以建立. PKCE 此字串是您將在要求中提交給的code_verifier參數值權杖端點

  5. 用SHA256算法散列code_verifier字符串。將雜湊作業的結果編碼為 base64。此字串是您將在要求中提交給的code_challenge參數值授權端點

    下列Python範例會產生code_verifier並計算code_challenge

    #!/usr/bin/env python3 import random from base64 import urlsafe_b64encode from hashlib import sha256 from string import ascii_letters from string import digits # use a cryptographically strong random number generator source rand = random.SystemRandom() code_verifier = ''.join(rand.choices(ascii_letters + digits, k=128)) code_verifier_hash = sha256(code_verifier.encode()).digest() code_challenge = urlsafe_b64encode(code_verifier_hash).decode().rstrip('=') print(f"code challenge: {code_challenge}") print(f"code verifier: {code_verifier}")

    以下是Python指令碼輸出的範例:

    code challenge: Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg code verifier: 9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
  6. 使用授權碼授予請求完成託管 UI 登錄PKCE。下面是一個例子URL:

    https://mydomain.us-east-1.amazoncognito.com/oauth2/authorize?response_type=code&client_id=1example23456789&redirect_uri=https://www.example.com&code_challenge=Eh0mg-OZv7BAyo-tdv_vYamx1boOYDulDklyXoMDtLg&code_challenge_method=S256
  7. 收集授權code並使用令牌端點將其兌換為令牌。以下是請求示例:

    POST /oauth2/token HTTP/1.1 Host: mydomain.us-east-1.amazoncognito.com Content-Type: application/x-www-form-urlencoded Content-Length: 296 redirect_uri=https%3A%2F%2Fwww.example.com& client_id=1example23456789& code=7378f445-c87f-400c-855e-0297d072ff03& grant_type=authorization_code& code_verifier=9D-aW_iygXrgQcWJd0y0tNVMPSXSChIc2xceDhvYVdGLCBk-JWFTmBNjvKSdOrjTTYazOFbUmrFERrjWx6oKtK2b6z_x4_gHBDlr4K1mRFGyE8yA-05-_v7Dxf3EIYJH
  8. 檢閱回應。它將包含 ID,訪問和刷新令牌。如需有關使用 Amazon Cognito 使用者集區權杖的詳細資訊,請參閱將權杖用於使用者集區