AWS re:Post을(를) 사용하면 다음에 동의하게 됩니다. AWS re:Post 이용 약관

Amazon Cognito 사용자 풀을 생성한 후 특성을 변경하려면 어떻게 해야 하나요?

5분 분량
0

Amazon Cognito 사용자 풀을 생성했는데 이제 사용자 등록에 필요한 표준 특성을 변경하고 싶습니다.

간략한 설명

사용자 풀을 생성한 후에는 표준 사용자 풀 특성을 변경할 수 없습니다. 대신 사용자 등록에 필요한 특성을 사용하여 새 사용자 풀을 생성합니다. 그런 다음 AWS Lambda 함수를 사용자 마이그레이션 트리거로 사용하여 기존 사용자를 새 사용자 풀로 마이그레이션합니다.

참고: 기존 사용자 풀에 사용자 지정 특성을 추가할 수 있지만 사용자 등록에는 이러한 특성이 필요하지 않습니다.

해결 방법

다른 특성을 가진 새 사용자 풀 설정

새 사용자 풀을 생성합니다. 그런 다음 풀 생성을 선택하기 전에 표준 특성을 원하는 대로 편집합니다.

중요: 사용자 풀에 새로운 필수 특성을 지정하는 경우 새 사용자 풀에 이러한 새 특성을 제공하도록 Lambda 함수를 설계하세요. 새 특성을 제공하도록 함수를 설계하지 않으면 사용자 마이그레이션 중에 인증이 실패합니다. 예를 들어 이전 사용자 풀에는 이메일만 필요했지만 새 사용자 풀에는 이메일전화번호가 모두 필요하다고 가정해 보겠습니다. 이 경우 전화번호의 속성 값을 새 사용자 풀에 전달하여 사용자를 성공적으로 인증합니다.

Lambda 함수 생성

사용자 마이그레이션 Lambda 함수를 생성하려면 Lambda 콘솔 편집기를 사용하거나 자체 배포 패키지를 빌드 및 업로드하세요.

중요: 이 예제 코드는 이전 사용자 풀에서 다중 인증(MFA)을 사용하는 사용자를 마이그레이션하는 데 사용할 수 없습니다.

구성을 테스트하려면 Python에서 다음 예제 함수를 사용합니다.

# Copyright 2018-2019 Amazon.com, Inc. or its affiliates. All Rights Reserved.
# Permission is hereby granted, free of charge, to any person obtaining a copy of this
# software and associated documentation files (the "Software"), to deal in the Software
# without restriction, including without limitation the rights to use, copy, modify,
# merge, publish, distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so.
#
# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED,
# INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
# PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
# HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
# OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.

import json
import boto3

client = boto3.client('cognito-idp')

def lambda_handler(event, context):
   if (event['triggerSource'] == 'UserMigration_Authentication'):
     user = client.admin_initiate_auth(
       UserPoolId='<user pool id of the user pool where the user already exists>',
       ClientId='<app client id of the user pool where the user already exists>',
       AuthFlow='ADMIN_NO_SRP_AUTH',
       AuthParameters={
         'USERNAME': event['userName'],
         'PASSWORD': event['request']['password']
       }
     )
        if (user):
       userAttributes = client.get_user(
         AccessToken=user['AuthenticationResult']['AccessToken']
       )
       for userAttribute in userAttributes['UserAttributes']:
         if userAttribute['Name'] == 'email':
           userEmail = userAttribute['Value']
           #print(userEmail)
           event['response']['userAttributes'] = {
             "email": userEmail,
             "email_verified": "true"
           }
          event['response']['messageAction'] = "SUPPRESS"
       print (event)
       return (event)
     else:
       return('Bad Password')
   elif (event["triggerSource"] == "UserMigration_ForgotPassword"):
     user = client.admin_get_user(
       UserPoolId='<user pool id of the user pool where the already user exists>',
       Username=event['userName']
     )
     if (user):
       for userAttribute in user['UserAttributes']:
         if userAttribute['Name'] == 'email':
           userEmail = userAttribute['Value']
           print(userEmail)
           event['response']['userAttributes'] = {
             "email": userEmail,
             "email_verified": "true"
           }
       event['response']['messageAction'] = "SUPPRESS"
          print (event)
       return (event)
     else:
       return('Bad Password')
          else:
     return('there was an error')

참고: UserPoolId를 이전 사용자 풀의 ID로 바꿉니다. 사용자 풀의 관리 페이지에 있는 Amazon Cognito 콘솔일반 설정 탭에서 ID를 찾습니다. ClientId를 이전 사용자 풀의 앱 클라이언트 ID로 바꿉니다. Amazon Cognito 콘솔의 앱 클라이언트에서 앱 클라이언트 ID를 찾습니다.

새 사용자 풀에 사용자 마이그레이션 트리거 추가

Amazon Cognito 콘솔에서 새 Lambda 함수를 사용자 마이그레이션 Lambda 트리거로 설정합니다. 자세한 내용은 사용자 풀 Lambda 트리거 추가를 참조하세요.

사용자 마이그레이션을 위해 USER_PASSWORD_AUTH 흐름 활성화

마이그레이션 시 USER_PASSWORD_AUTH 인증 흐름을 사용하도록 사용자 풀 앱 클라이언트를 구성합니다. 이 인증 흐름을 통해 앱은 사용자의 사용자 이름과 암호를 Lambda 함수에 전달할 수 있습니다. 그러면 인증 흐름은 기존 사용자 풀에서 사용자를 인증할 수 있습니다.

앱에 로직을 추가하여 기본 인증 흐름을 USER_PASSWORD_AUTH 흐름으로 변경합니다. 기존 사용자 풀에는 있지만 새 사용자 풀에는 존재하지 않는 사용자의 로그인 시도에 대한 인증 흐름을 로직이 변경하도록 합니다.

예를 들어 앱에서 JavaScript를 사용하는 경우 cognitoUser.setAuthenticationFlowTypeUSER_PASSWORD_AUTH로 지정합니다.

참고: 사용자를 마이그레이션한 후에는 앱의 인증 흐름을 USER_SRP_AUTH로 변경하는 것이 좋습니다. 이 흐름은 보안 원격 암호(SRP) 프로토콜을 사용하여 네트워크를 통해 암호를 전송할 필요 없이 사용자를 인증합니다. 또한 이 흐름은 USER_PASSWORD_AUTH 흐름에 비해 보안상의 이점을 제공합니다.

cognitoUser.setAuthenticationFlowType('USER_PASSWORD_AUTH');
    cognitoUser.authenticateUser(authenticationDetails, {
        onSuccess: function(result) {
            // User authentication was successful
        },
        onFailure: function(err) {
            // User authentication was not successful
        },
        mfaRequired: function (codeDeliveryDetails) {
            // MFA is required to complete user authentication.
            // Get the code from user and call
            cognitoUser.sendMFACode(verificationCode, this);
        }
    });

설정 테스트

Amazon Cognito에서 호스팅하는 웹 UI를 사용하여 앱에 로그인하고 인증 흐름을 테스트합니다. 로그인한 사용자는 새 사용자 풀로 인증된 후 마이그레이션됩니다.

참고: 구성을 테스트하기 위해 로그인할 사용자 계정이 없는 경우 새 사용자를 생성합니다.

문제 해결

테스트하는 동안 "사용자 마이그레이션 중 예외"와 같은 오류 메시지가 표시되면 Lambda에서 로깅 명령문을 켭니다. 이 설정은 사용자 마이그레이션 Lambda 트리거의 파라미터Amazon CloudWatch Logs에 기록합니다. 오류를 재현한 다음 사용자 마이그레이션 Lambda 트리거의 파라미터 또는 구문 오류와 관련된 문제가 있는지 로그를 검토합니다.

관련 정보

Lambda 트리거를 사용한 사용자 풀 워크플로 사용자 지정

Amazon Cognito 사용자 풀과 ID 풀의 차이점은 무엇인가요?

사용자 풀

AWS 공식
AWS 공식업데이트됨 7달 전