기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
인증 챌린지 트리거 정의는 사용자 지정 인증 흐름에서 챌린지 시퀀스를 유지하는 Lambda 함수입니다. 챌린지 시퀀스의 성공 또는 실패를 선언하고 시퀀스가 아직 완료되지 않은 경우 다음 챌린지를 설정합니다.
- 인증 문제 정의
-
Amazon Cognito가 이 트리거를 호출하여 사용자 지정 인증 흐름을 시작합니다.
이 Lambda 트리거에 대한 요청에는 session
이 포함됩니다. session
파라미터는 현재 인증 프로세스에서 사용자에게 표시되는 모든 문제가 포함된 배열입니다. 해당하는 결과를 포함하는 어레이입니다. session
배열에는 문제 세부 정보(ChallengeResult
)가 시간순으로 저장됩니다. 문제 session[0]
은 사용자가 수신하는 첫 번째 문제를 나타냅니다.
Amazon Cognito가 사용자 지정 문제를 표시하기 전에 사용자 암호를 확인하도록 할 수 있습니다. 요청 속도 할당량의 인증 범주에 연결된 모든 Lambda 트리거는 사용자 지정 챌린지 흐름에서 SRP 인증을 수행할 때 실행됩니다. 다음은 이 프로세스의 개요입니다.
-
앱이
AuthParameters
맵으로InitiateAuth
또는AdminInitiateAuth
를 호출하여 로그인을 시작합니다. 파라미터에는CHALLENGE_NAME: SRP_A,
와,SRP_A
및USERNAME
에 대한 값이 포함되어야 합니다. -
Amazon Cognito는
challengeName: SRP_A
및challengeResult: true
를 포함하는 초기 세션과 함께 인증 문제 정의 Lambda 트리거를 호출합니다. -
이러한 입력을 수신한 후 Lambda 함수는
challengeName: PASSWORD_VERIFIER
,issueTokens: false
,failAuthentication: false
로 응답합니다. -
암호 확인이 성공하면 Amazon Cognito가
challengeName: PASSWORD_VERIFIER
및challengeResult: true
가 포함된 새 세션을 사용하여 Lambda 함수를 다시 호출합니다. -
사용자 지정 문제를 시작하려면 Lambda 함수가
challengeName: CUSTOM_CHALLENGE
,issueTokens: false
및failAuthentication: false
로 응답합니다. 암호 확인을 사용하여 사용자 지정 인증 흐름을 시작하지 않으려면CHALLENGE_NAME: CUSTOM_CHALLENGE
를 포함한AuthParameters
맵으로 로그인을 시작하면 됩니다. -
모든 챌린지에 응답할 때까지 챌린지 루프가 반복됩니다.
다음은 SRP 흐름으로 사용자 지정 인증을 수행하는 시작 InitiateAuth
요청의 예입니다.
{
"AuthFlow": "CUSTOM_AUTH",
"ClientId": "1example23456789",
"AuthParameters": {
"CHALLENGE_NAME": "SRP_A",
"USERNAME": "testuser",
"SRP_A": "[SRP_A]",
"SECRET_HASH": "[secret hash]"
}
}
인증 챌린지 정의 Lambda 트리거 파라미터
Amazon Cognito가 이 Lambda 함수에 전달하는 요청은 아래 파라미터와 Amazon Cognito가 모든 요청에 추가하는 공통 파라미터의 조합입니다.
{
"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
-
사용자 풀 클라이언트에 대해
PreventUserExistenceErrors
가ENABLED
로 설정된 경우 Amazon Cognito에서 채우는 부울입니다. 값이true
이면 해당 사용자 ID(사용자 이름, 이메일 주소, 기타 세부 정보)와 일치하는 기존 사용자가 없는 것입니다.PreventUserExistenceErrors
가ENABLED
로 설정된 경우 서비스는 존재하지 않는 사용자를 앱에 알리지 않습니다. Lambda 함수에서 동일한 사용자 경험을 유지하고 대기 시간을 고려하는 것이 좋습니다. 이렇게 하면 호출자가 사용자의 존재 여부에 상관없이 동일한 동작을 감지할 수 있습니다. - 세션
-
ChallengeResult
요소 배열입니다. 각각 다음 요소가 포함됩니다.- challengeName
-
CUSTOM_CHALLENGE
, ,SRP_A
,PASSWORD_VERIFIER
, ,SMS_MFA
,EMAIL_OTP
,DEVICE_SRP_AUTH
DEVICE_PASSWORD_VERIFIER
,SOFTWARE_TOKEN_MFA
또는 챌린지 유형 중 하나입니다ADMIN_NO_SRP_AUTH
.인증 챌린지 정의 함수가 다단계 인증을 설정한 사용자에게
PASSWORD_VERIFIER
챌린지를 발생시키면 Amazon Cognito는 이를SMS_MFA
,EMAIL_OTP
또는SOFTWARE_TOKEN_MFA
챌린지로 후속 조치를 취합니다. 다음은 다중 인증 코드에 대한 프롬프트입니다. 함수에 ,SMS_MFA
EMAIL_OTP
및SOFTWARE_TOKEN_MFA
챌린지의 입력 이벤트 처리를 포함합니다. 정의 인증 MFA 챌린지 함수에서 챌린지를 호출할 필요가 없습니다.중요
사용자가 성공적으로 인증되었고 토큰을 발급받아야 하는지 여부를 함수가 결정할 때 인증 챌린지 정의 함수에서 항상
challengeName
을 확인하여 예상 값과 일치하는지 확인해야 합니다. - challengeResult
-
사용자가 챌린지를 성공적으로 완료하면
true
로 설정하고 그렇지 않으면false
로 설정합니다. - challengeMetadata
-
사용자 지정 챌린지의 이름입니다.
challengeName
이CUSTOM_CHALLENGE
인 경우에만 사용됩니다.
- clientMetadata
-
인증 문제 정의 트리거에 지정하는 Lambda 함수에 사용자 지정 입력으로 제공할 수 있는 하나 이상의 키-값 쌍입니다. 이 데이터를 Lambda 함수에 전달하려면 AdminRespondToAuthChallenge 및 RespondToAuthChallenge API 작업에서
ClientMetadata
파라미터를 사용할 수 있습니다. 정의 인증 챌린지 함수를 호출하는 요청에는 AdminInitiateAuth 및 InitiateAuth API 작업의 ClientMetadata 파라미터에 전달된 데이터가 포함되지 않습니다.
인증 챌린지 정의 응답 파라미터
응답에서 인증 프로세스의 다음 단계를 반환할 수 있습니다.
- challengeName
-
다음 문제의 이름이 포함된 문자열입니다. 사용자에게 새로운 챌린지를 표시하려면 여기에 챌린지 이름을 지정하세요.
- issueTokens
-
사용자가 인증 문제를 충분히 완료했다고 확인한 경우
true
로 설정합니다. 사용자가 문제를 충분히 충족하지 못한 경우false
로 설정합니다. - failAuthentication
-
현재 인증 프로세스를 종료하려는 경우
true
로 설정합니다. 현재 인증 프로세스를 계속하려면false
로 설정합니다.
인증 챌린지 정의 예제
이 예에서는 인증을 위한 일련의 문제를 정의하고 사용자가 모든 문제를 성공적으로 완료한 경우에만 토큰을 발행합니다.
const handler = async (event) => {
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 = false;
event.response.failAuthentication = false;
event.response.challengeName = "CUSTOM_CHALLENGE";
} else if (
event.request.session.length === 4 &&
event.request.session[3].challengeName === "CUSTOM_CHALLENGE" &&
event.request.session[3].challengeResult === true
) {
event.response.issueTokens = true;
event.response.failAuthentication = false;
} else {
event.response.issueTokens = false;
event.response.failAuthentication = true;
}
return event;
};
export { handler };