建立驗證挑戰 Lambda 觸發程序 - Amazon Cognito

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

建立驗證挑戰 Lambda 觸發程序

挑戰 Lambda 觸發程序
建立驗證挑戰

如果自訂挑戰已指定為 Define Auth Challenge (定義驗證挑戰) 觸發程序的一部分,Amazon Cognito 就會在 Define Auth Challenge (定義驗證挑戰) 之後叫用此觸發程序。它會建立自訂身分驗證流程

叫用此 Lambda 觸發程序可以建立要向使用者提出的挑戰。此 Lambda 觸發程序的請求包含 challengeNamesessionchallengeName是要向使用者提出之下一個挑戰的名稱字串。此屬性的值是設定在「定義驗證挑戰 Lambda 觸發程序」中。

除非所有挑戰都已回答,否則挑戰迴圈會不斷重複。

建立驗證挑戰 Lambda 觸發程序參數

Amazon Cognito 傳遞至此 Lambda 函數的請求,是以下參數和 Amazon Cognito 新增至所有請求的常用參數之組合。

JSON
{ "request": { "userAttributes": { "string": "string", . . . }, "challengeName": "string", "session": [ ChallengeResult, . . . ], "clientMetadata": { "string": "string", . . . }, "userNotFound": boolean }, "response": { "publicChallengeParameters": { "string": "string", . . . }, "privateChallengeParameters": { "string": "string", . . . }, "challengeMetadata": "string" } }

建立驗證挑戰請求參數

userAttributes

代表使用者屬性的一或多組名稱/值。

userNotFound

當您的使用者集區用戶端的 PreventUserExistenceErrors 設定為 ENABLED 時,將會填入此布林值。

challengeName

新挑戰的名稱。

工作階段

工作階段元素是 ChallengeResult元素陣列,每個陣列都包含下列元素:

challengeName

挑戰類型。下列其中一項:"CUSTOM_CHALLENGE""PASSWORD_VERIFIER""SMS_MFA""DEVICE_SRP_AUTH""DEVICE_PASSWORD_VERIFIER""ADMIN_NO_SRP_AUTH"

challengeResult

如果使用者順利完成挑戰,則設定為 true,否則設定為 false

challengeMetadata

您的自訂挑戰名稱。唯有在 challengeName"CUSTOM_CHALLENGE" 時使用。

clientMetadata

您可以做為 Lambda 函數的自訂輸入提供的一個或多個鍵值組,該函數是您用於建立驗證挑戰觸發程序所指定。您可以使用 AdminRespondToAuthChallengeRespondToAuthChallenge API 動作中的 ClientMetadata 參數,將此資料傳遞至您的 Lambda 函數。叫用建立身分驗證挑戰函數的請求不包含傳遞至 AdminInitiateAuthInitiateAuth API 操作的 ClientMetadata 參數中的資料。

建立驗證挑戰回應參數

publicChallengeParameters

可讓用戶端應用程式用在要向使用者提出的挑戰中的一或多個鍵值組。此參數應包含所有必要資訊,以準確地向使用者提出挑戰。

privateChallengeParameters

此參數僅供「確認驗證挑戰回應 Lambda 觸發程序」使用。此參數應包含驗證使用者對挑戰的回應時,所有必要的資訊。換言之,publicChallengeParameters參數包含向使用者提出的問題,而 privateChallengeParameters 包含問題的有效答案。

challengeMetadata

您的自訂挑戰名稱 (如果這是自訂挑戰)。

建立驗證挑戰範例

建立 CAPTCHA 以做為對使用者的挑戰。CAPTCHA 影像的 URL 會以 "captchaUrl" 新增至公有挑戰參數,而預期的答案會新增至私有挑戰參數。

Node.js
const handler = async (event) => { if (event.request.challengeName !== "CUSTOM_CHALLENGE") { return event; } if (event.request.session.length === 2) { event.response.publicChallengeParameters = {}; event.response.privateChallengeParameters = {}; event.response.publicChallengeParameters.captchaUrl = "url/123.jpg"; event.response.privateChallengeParameters.answer = "5"; } if (event.request.session.length === 3) { event.response.publicChallengeParameters = {}; event.response.privateChallengeParameters = {}; event.response.publicChallengeParameters.securityQuestion = "Who is your favorite team mascot?"; event.response.privateChallengeParameters.answer = "Peccy"; } return event; }; export { handler }