當我嘗試存取 Amazon Cognito 使用者集區 API 時,出現「Unable to verify secret hash for client」(無法驗證用戶端的密碼雜湊) 錯誤。我想對此問題進行疑難排解。
解決方法
將使用者集區應用程式用戶端設定為用戶端密碼時,您必須在 API 的查詢參數中包含密碼雜湊值。如果沒有包含密碼雜湊值,則 Amazon Cognito 會傳回 Unable to verify secret hash for client (無法驗證用戶端的密碼雜湊) 錯誤。
若要解決這個問題,請計算密碼雜湊值。然後,當您呼叫接受密碼雜湊的 Amazon Cognito API (例如 InitiateAuth 或 ForgotPassword) 時包含該值。
注意: 如果您在執行 AWS Command Line Interface (AWS CLI) 命令時收到錯誤訊息,則請參閱對 AWS CLI 進行錯誤疑難排解。此外,請確定您使用的是最新的 AWS CLI 版本。
計算密碼雜湊值
若要計算密碼雜湊值,您必須具有以下資訊:
- 應用程式用戶端 ID
- 應用程式用戶端密碼
- Amazon Cognito 使用者集區中的使用者名稱
若要自動化此程序,請請完成以下步驟:
- 從 Python 網站下載適用於 Windows 的最新版 Python。然後,在本機電腦上安裝 Python。
- 將以下範例 Python 指令碼儲存為 .py 檔案。例如,您可以將檔案儲存為 secret_hash.py。下列指令碼使用應用程式用戶端密碼作為金鑰,並使用 SHA256 雜湊函數來顯示 HMAC 摘要的計算:
import sys, hmac, hashlib, base64
# Unpack command line arguments
username, app_client_id, key = sys.argv[1:4]
# Create message and key bytes
message, key = (username + app_client_id).encode('utf-8'), key.encode('utf-8')
# Calculate secret hash
secret_hash = base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()
print(f"Secret Hash for user '{username}': {secret_hash}")
注意: 將 username (使用者名稱) 替換為使用者集區中使用者的使用者名稱。另外,將 app_client_id 替換為使用者集區的應用程式用戶端 ID,將 key (金鑰) 替換為應用程式用戶端的金鑰。
- 若要取得密碼雜湊值,請執行以下命令:
python3 secret_hash.py username app_client_id app_client_secret
注意: 如果您執行的是 Python 3.0 之前的版本,請將 python3 替換為 python。將 secret_hash.py 替換為您的檔案名稱,將 username (使用者名稱) 替換為使用者集區的使用者名稱,將 app_client_id 替換為應用程式用戶端 ID,將 app_client_secret 替換為應用程式用戶端的密碼。
在 API 呼叫中包含密碼雜湊值
將密碼雜湊值作為 SECRET_HASH 參數新增至 API 呼叫的查詢字串參數。
包含 SECRET_HASH 參數的 InitiateAuth API 呼叫範例:
aws cognito-idp initiate-auth --auth-flow USER_PASSWORD_AUTH --auth-parameters USERNAME=username,PASSWORD=password,SECRET_HASH=secret_hash --client-id example_client-id
InitiateAuth API 呼叫輸出範例:
{
"ChallengeParameters": {},
"AuthenticationResult": {
"AccessToken": "<HIDDEN>",
"ExpiresIn": 3600,
"TokenType":
"Bearer",
"RefreshToken": "<HIDDEN>",
"IdToken": "<HIDDEN>"
}
}
注意: 如果您使用 USER\PASSWORD\AUTH 驗證流程,請為應用程式用戶端開啟 ALLOW\USER\PASSWORD_AUTH。
包含 SECRET_HASH 參數的 ForgotPassword API 呼叫範例:
aws cognito-idp forgot-password --client-id example_client-id --username example_username --secret-hash example_secret-hash
注意: 將 username (使用者名稱) 替換為您的使用者名稱,將 secret-hash 替換為您的密碼雜湊。
ForgotPassword API 呼叫輸出範例:
{
"CodeDeliveryDetails": {
"Destination": "+***********",
"DeliveryMedium": "SMS",
"AttributeName": "phone_number"
}
}