本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
在授權碼授予PKCE中使用
Amazon Cognito 在授權碼授予中支援 Code Exchange (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
-
開啟 Amazon Cognito 主控台
。如果出現提示,請輸入您的 AWS 憑證。 -
選擇 User Pools (使用者集區)。
-
從清單中選擇現有的使用者集區,或建立使用者集區。如果您建立使用者集區,系統會提示您在精靈期間設定應用程式用戶端和設定託管 UI。
-
產生隨機英數字串,通常是全域唯一識別碼 (UUID),以為 建立程式碼挑戰PKCE。此字串是您將在請求中提交給 的
code_verifier
參數值權杖端點。 -
使用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
-
使用 的授權碼授予請求完成託管 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 -
收集授權
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
-
檢閱回應。它將包含 ID、存取和重新整理權杖。如需使用 Amazon Cognito 使用者集區權杖的詳細資訊,請參閱 了解使用者集區 JSON Web 權杖 (JWTs)。