인증 챌린지 정의 Lambda 트리거 - Amazon Cognito

인증 챌린지 정의 Lambda 트리거


            문제 Lambda 트리거
인증 문제 정의

Amazon Cognito가 이 트리거를 호출하여 사용자 지정 인증 흐름을 시작합니다.

이 Lambda 트리거에 대한 요청에는 session이 포함됩니다. session 파라미터는 현재 인증 프로세스에서 사용자에게 표시되는 모든 문제가 포함된 배열입니다. 해당하는 결과를 포함하는 어레이입니다. session 배열에는 문제 세부 정보(ChallengeResult)가 시간순으로 저장됩니다. 문제 session[0]은 사용자가 수신하는 첫 번째 문제를 나타냅니다.

Amazon Cognito가 사용자 지정 문제를 표시하기 전에 사용자 암호를 확인하도록 할 수 있습니다. 다음은 이 프로세스의 개요입니다.

  1. 앱이 AuthParameters 맵으로 InitiateAuth 또는 AdminInitiateAuth를 호출하여 로그인을 시작합니다. 파라미터에는 CHALLENGE_NAME: SRP_A,와, SRP_AUSERNAME에 대한 값이 포함되어야 합니다.

  2. Amazon Cognito는 challengeName: SRP_AchallengeResult: true를 포함하는 초기 세션과 함께 인증 문제 정의 Lambda 트리거를 호출합니다.

  3. 이러한 입력을 수신한 후 Lambda 함수는 challengeName: PASSWORD_VERIFIER, issueTokens: false, failAuthentication: false로 응답합니다.

  4. 암호 확인이 성공하면 Amazon Cognito가 challengeName: PASSWORD_VERIFIERchallengeResult: true가 포함된 새 세션을 사용하여 Lambda 함수를 다시 호출합니다.

  5. 사용자 지정 문제를 시작하려면 Lambda 함수가 challengeName: CUSTOM_CHALLENGE, issueTokens: falsefailAuthentication: false로 응답합니다. 암호 확인을 사용하여 사용자 지정 인증 흐름을 시작하지 않으려면 CHALLENGE_NAME: CUSTOM_CHALLENGE를 포함한 AuthParameters 맵으로 로그인을 시작하면 됩니다.

  6. 모든 챌린지에 응답할 때까지 챌린지 루프가 반복됩니다.

인증 챌린지 정의 Lambda 트리거 파라미터

이러한 파라미터는 Amazon Cognito가 공통 파라미터의 이벤트 정보와 함께 이 Lambda 함수에 전달하는 파라미터입니다.

JSON
{ "request": { "userAttributes": { "string": "string", . . . }, "session": [ ChallengeResult, . . . ], "clientMetadata": { "string": "string", . . . }, "userNotFound": boolean }, "response": { "challengeName": "string", "issueTokens": boolean, "failAuthentication": boolean }

인증 챌린지 정의 요청 파라미터

Amazon Cognito에서 Lambda 함수를 호출하면 Amazon Cognito가 다음과 같은 파라미터를 제공합니다.

userAttributes

사용자 속성을 나타내는 하나 이상의 이름-값 페어입니다.

userNotFound

사용자 풀 클라이언트에 대해 PreventUserExistenceErrorsENABLED로 설정된 경우 Amazon Cognito에서 채우는 부울입니다. 값이 true이면 해당 사용자 ID(사용자 이름, 이메일 주소 등)와 일치하는 기존 사용자가 없는 것입니다. PreventUserExistenceErrorsENABLED로 설정된 경우 서비스는 존재하지 않는 사용자를 앱에 알리지 않습니다. Lambda 함수에서 동일한 사용자 경험을 유지하고 대기 시간을 고려하는 것이 좋습니다. 이렇게 하면 호출자가 사용자의 존재 여부에 상관없이 동일한 동작을 감지할 수 있습니다.

세션

ChallengeResult 요소 배열입니다. 각각 다음 요소가 포함됩니다.

challengeName

문제 유형 CUSTOM_CHALLENGE, SRP_A, PASSWORD_VERIFIER, SMS_MFA, DEVICE_SRP_AUTH, DEVICE_PASSWORD_VERIFIER, ADMIN_NO_SRP_AUTH 중 하나입니다.

중요

사용자가 성공적으로 인증되었고 토큰을 발급받아야 하는지 함수에서 확인할 때 항상 DefineAuthChallenge Lambda 트리거에서 challengeName을 점검하여 예상 값과 일치하는지 확인해야 합니다.

challengeResult

사용자가 챌린지를 성공적으로 완료하면 true로 설정하고 그렇지 않으면 false로 설정합니다.

challengeMetadata

사용자 지정 챌린지의 이름입니다. challengeNameCUSTOM_CHALLENGE인 경우에만 사용됩니다.

clientMetadata

인증 문제 정의 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 쌍입니다. 이 데이터를 Lambda 함수에 전달하려면 AdminRespondToAuthChallengeRespondToAuthChallenge API 작업에서 ClientMetadata 파라미터를 사용합니다. 인증 문제 정의 함수를 호출하는 요청에는 AdminInitiateAuthInitiateAuth API 작업의 ClientMetadata 파라미터에 전달된 데이터가 포함되지 않습니다.

인증 챌린지 정의 응답 파라미터

응답에서 인증 프로세스의 다음 단계를 반환할 수 있습니다.

challengeName

다음 문제의 이름이 포함된 문자열입니다. 사용자에게 새로운 챌린지를 표시하려면 여기에 챌린지 이름을 지정하십시오.

issueTokens

사용자가 인증 문제를 충분히 완료했다고 확인한 경우 true로 설정합니다. 사용자가 문제를 충분히 충족하지 못한 경우 false로 설정합니다.

failAuthentication

현재 인증 프로세스를 종료하려는 경우 true로 설정합니다. 현재 인증 프로세스를 계속하려면 false로 설정합니다.

인증 챌린지 정의 예제

이 예에서는 인증을 위한 일련의 문제를 정의하고 사용자가 모든 문제를 성공적으로 완료한 경우에만 토큰을 발행합니다.

Node.js
exports.handler = (event, context, callback) => { if (event.request.session.length == 1 && event.request.session[0].challengeName == 'SRP_A') { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = 'PASSWORD_VERIFIER'; } else if (event.request.session.length == 2 && event.request.session[1].challengeName == 'PASSWORD_VERIFIER' && event.request.session[1].challengeResult == true) { event.response.issueTokens = false; event.response.failAuthentication = false; event.response.challengeName = 'CUSTOM_CHALLENGE'; } else if (event.request.session.length == 3 && event.request.session[2].challengeName == 'CUSTOM_CHALLENGE' && event.request.session[2].challengeResult == true) { event.response.issueTokens = true; event.response.failAuthentication = false; } else { event.response.issueTokens = false; event.response.failAuthentication = true; } // Return to Amazon Cognito callback(null, event); }