Amazon Cognito란?
Amazon Cognito
는 웹 및 모바일 앱에 대한 인증, 권한 부여 및 사용자 관리를 제공합니다. 사용자는 사용자 이름과 암호를 사용하여 직접 로그인하거나 Facebook, Amazon, Google 또는 Apple 같은 타사를 통해 로그인할 수 있습니다.
Amazon Cognito
의 두 가지 주요 구성 요소는 사용자 풀
과 자격 증명 풀
입니다. 사용자 풀은 앱 사용자의 가입 및 로그인 옵션을 제공하는 사용자 디렉터리입니다. 자격 증명 풀을 통해 사용자에게 기타 AWS 서비스에 액세스할 수 있는 권한을 부여할 수 있습니다. 자격 증명 풀과 사용자 풀을 별도로 또는 함께 사용할 수 있습니다.
Amazon Cognito의 기능
User pool
User pool
은 Amazon Cognito의 사용자 디렉터리입니다. 사용자 풀에서 사용자는 Amazon Cognito를 통해, 또는 서드 파티 자격 증명 공급자(IdP)를 통해 페더레이션하여 웹 또는 모바일 앱에 로그인할 수 있습니다. 사용자가 직접 또는 타사를 통해 로그인하는지 여부와 무관하게 사용자 풀의 모든 멤버는 디렉터리 프로필을 보유하며, SDK를 통해 액세스할 수 있습니다.
User pool이 제공하는 서비스
- 가입 및 로그인 서비스
- 사용자 로그인을 위한 내장 사용자 지정 웹 UI
- Facebook, Google 등 소셜 로그인 및 OIDC, SMAIL 자격 증명 공급자를 통한 로그인
- 사용자 디렉토리 관리 및 사용자 프로필
- 멀티 팩터 인증(MFA), 이상 있는 자격 증명 확인, 계정 탈취 보호, 전화 및 이메일 확인과 같은 보안 기능.
- AWS Lambda 트리거를 통한 사용자 지정 워크플로우 및 사용자 마이그레이션
Identity pool
Identity pool
을 이용하여 사용자는 임시 AWS 자격 증명을 얻어 Amazon S3, DynamoDB 등의 다른 AWS 서비스에 액세스할 수 있습니다. 자격 증명 풀은 익명 게스트 사용자는 물론 자격 증명에 대한 사용자 인증에 사용할 수 있는 다음 자격 증명 공급자를 지원합니다.
- Amazon Cognito user pools
- Facebook, Google, Login with Amazon 및 Sign in with Apple을 통한 소셜 로그인
- OpenID Connect(OIDC) 공급자
- SAML 자격 증명 공급자
- 개발자 인증 자격 증명
자격 증명 풀에 대한 자세한 내용은 아래 게시글에서 보시면 됩니다
[AWS] Android에서 Amplify를 이용해 Cognito 자격으로 S3에 업로드하기
AWS Amplify란?
AWS Amplify
는 개발자가 웹 또는 모바일 플랫폼에서 클라우드 서비스로 애플리케이션을 구축할 수 있도록 하는 Amazon Web Services( AWS )에서 제공 하는 오픈 소스 JavaScript 라이브러리입니다.
AWS는 웹 및 모바일 개발자가 AWS에서 호스팅하는 확장 가능한 전체 스택 애플리케이션을 개발할 수 있도록 설계된 전체 스택 플랫폼입니다. AWS Amplify를 이용하면 사용자가 백엔드를 쉽게 구성하고, 앱을 연결하고, 정적 웹 앱을 즉시 배포하고, AWS 콘솔 외부에서 콘텐츠를 관리할 수 있게 해주는 수많은 도구와 서비스가 포함되어 있습니다.
AWS Amplify를 사용하면 코드 몇 줄만 작성하고도 오프라인 데이터, MFA(멀티 팩터 인증), 분석 등의 기능을 애플리케이션에 빠르게 추가할 수 있습니다. 직관적인 워크플로를 사용하여 Amazon Cognito, AWS Lambda, Amazon S3 같은 기본 클라우드 서비스를 Amplify CLI 또는 Amplify Studio에서 직접 구성할 수 있으므로 백엔드 서비스를 설정하고 관리하는 데 필요한 시간을 최소화할 수 있습니다.
또한, Amplify CLI 없이도 생성한 백엔드 리소스에 액세스하는 데 라이브러리를 사용할 수 있습니다. 이번 포스트에는 CLI를 사용하지 않고 Amplify를 사용해보도록 하겠습니다.
Amazon Cognito Console에서 User pool 생성하기
먼저 User Pool을 생성해보겠습니다.
https://ap-northeast-2.console.aws.amazon.com/cognito/v2/idp/user-pools?region=ap-northeast-2
위 링크에 들어가시면 아래와 같은 화면이 보일 것 입니다.
User pool을 만들기 위해 Create User pool을 눌러줍니다.
아래의 6가지 설정을 마친 후에 User pool을 생성할 수 있습니다.
Step1. 로그인 환경 구성(Configure sign-in experience)
첫번째 단계는 로그인 환경 구성(Configure sign-in experience)
설정입니다.
여기서 사용자 풀에 사용할 페더레이션 공급자를 설정합니다.
Federated identity providers
-> Amazon Cognito의 페더레이션을 통해 사용자는 기존 ID 데이터를 사용하여 Google, Facebook, Amazon 또는 Apple에 로그인할 수 있습니다. OIDC 또는 SAML 기반 싱글 사인온을 지원하는 내부 디렉터리에서 사용자 ID 정보를 가져올 수도 있습니다.
Cognito user pool sign-in options
-> Amazon Cognito의 디렉터리를 사용하여 인증을 관리하도록 사용자 풀을 구성하는 경우 사용자가 자신을 식별하는 방법을 선택합니다. 사용자의 이메일 주소, 전화번호 또는 사용자가 입력한 고유한 이름을 선택할 수 있습니다.
이 예제에서는 Cognito User pool을 체크해주고 Email을 식별자로 선택해 준 뒤에 Next를 눌러서 다음 단계로 넘어가겠습니다.
Step2. 보안 요구 사항 구성(Configure security requirements) 설정
두번 째 단계는 보안 요구 사항 구성(Configure security requirements)
설정입니다.
이 단계에서 비밀번호 정책과 멀티 팩터 인증(MFA) 설정, 사용자 계정 복구 옵션을 설정합니다.
Password policy
-> 비밀번호 regex의 숫자, 특수문자, 대소문자를 어떻게 조합할 것인지를 설정합니다.
멀티 팩터 인증(MFA)는 로그인 프로세스에 어떤 인증 절차를 추가할 지를 설정합니다.
사용자 계정 복구 옵션은 사용자 계정을 복구할 때 어떠한 절차를 사용하게 할 것인지를 설정합니다.
Multi-factor authentication
-> 다단계 인증을 설정합니다. SMS 또는 Authy 혹은 Google Authentication을 통한 TOTP(시간 기반 일회용 암호)를 사용할 수 있습니다.
User account recovery
-> 사용자 계정 복구방법을 선택합니다.
MFA는 SMS Message에 체크하고 나머지는 전부 default 값으로 설정하고 다음 단계로 넘어가겠습니다.
Step3. 가입 환경 구성(Configure sign-up experience)
가입 환경 구성(Configure sign-up experience)
에서 새 사용자가 가입(Sign-up)할 때 자격 증명을 확인하는 방법과 사용자 가입 흐름 중에 필수 또는 선택 사항이어야 하는 속성을 결정합니다.
Self-service sign-up(자체 등록 활성화)
- 퍼블릭 SignUp API 사용자가 사전 AWS IAM 인증 없이 계정을 생성할 수 있도록 허용합니다. 공개 가입 엔드포인트에 대한 액세스 권한이 있는 모든 사용자가 사용자 풀에 계정을 생성할 수 있도록 선택할 수 있습니다. "자체 등록 활성화"를 선택하면 호스팅된 UI의 로그인 페이지에 "가입" 링크가 추가됩니다.
Cognito-assisted verification and confirmation(Cognito 기본 방법 사용)
- 활성화된 경우 Amazon Cognito는 사용자가 제공한 이메일 주소 또는 전화번호로 자동 메시지로 Sign-up을 요청합니다. 그 후에, Sign-up 요청에서 사용자는 코드를 입력하여 연락처 속성을 확인하고 계정을 확인합니다.
Verifying attribute changes(속성 변경 확인)
- 사용자가 이메일 주소 또는 전화번호 속성을 업데이트하면 Amazon Cognito unverified는 새 값을 확인할 때까지 이를 표시합니다. Amazon Cognito가 업데이트된 이메일 주소 또는 전화번호를 처리하는 방법을 선택할 수 있습니다.
Required attributes(필수 속성)
- 새 사용자가 생성될 때 필요한 속성을 선택합니다. Cognito는 OIDC(OpenID Connect) 표준을 기반으로 모든 사용자에게 일련의 표준 속성을 할당합니다.
이번 설정도 default 값으로 설정하고 다음 단계로 이동하겠습니다.
Step4. 메시지 전달 구성(Configure message delivery)
메시지 전달 구성(Configure message delivery)
에서 가입, 계정 확인, MFA, 계정 복구를 위해 사용자에게 이메일과 SMS 메시지를 전송하도록 Amazon Simple Email Service(Amazon SES) 및 Amazon Simple Notification Service(Amazon SNS)와의 통합을 구성합니다.
Email
-> User pool이 사용자에게 이메일 메시지를 보내는 방법을 구성합니다.
SMS
-> 사용자 풀이 사용자에게 SMS 메시지를 보내는 방법을 구성합니다. 수신자 메시지 및 데이터 요금이 적용됩니다.
Email은 Amazon SES가 권장사항이지만 예제이기 때문에 Send email with Cognito로 설정해주고, SMS는 새로운 IAM Role을 생성해주고 다음 단계로 넘어가주겠습니다.
Step5. 앱 통합 설정(Integrate your app)
앱 통합(Integrate your app)
에서 사용자 풀의 이름을 지정하고 호스트된 UI를 구성한 다음, 앱 클라이언트를 생성합니다.
이 단계에서는 앱을 사용자 풀에 연결하고 OAuth 2.0 토큰을 생성하도록 Amazon Cognito에 권한을 부여하는 앱 클라이언트를 생성합니다.
User pool 이름과 앱 클라이언트 이름을 지정해주고 다음 단계로 넘어가겠습니다.
Step6. 검토 및 생성(Review and Create)
마지막 단계는 검토 및 생성(Review and Create)
단계인데 이전 단계의 설정들을 검토하고 최종적으로 생성하는 단계입니다.
이 단계에서 모든 단계의 설정을 마친후 User pool이 생성됩니다.
Android에서 Amplify 적용 후 회원가입, 로그인하기
Android에서 Amplify를 이용하여 회원가입 로그인을 코루틴을 사용하여 적용해보겠습니다.
app의 build.gradle에 AmplifyFramework 및 코루틴 라이브러리 추가
// ...
android {
// ...
}
dependencies {
// aws-amplify
implementation 'com.amplifyframework:core:1.37.2'
implementation 'com.amplifyframework:aws-auth-cognito:1.37.2'
// kotlinx-coroutines-android
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.4'
}
amplifyconfiguration.json 추가
app/src/main의 res 폴더에 amplifyconfiguration.json
파일을 만들어서 아래의 내용을 채워넣습니다.
{
"UserAgent": "aws-amplify-cli/2.0",
"Version": "1.0",
"auth": {
"plugins": {
"awsCognitoAuthPlugin": {
"IdentityManager": {
"Default": {}
},
// "CredentialsProvider": {
// ...
// },
"CognitoUserPool": {
"Default": {
"PoolId": "[COGNITO USER POOL ID]",
"AppClientId": "[COGNITO USER POOL APP CLIENT ID]",
"AppClientSecret": "[COGNITO USER POOL APP CLIENT SECRET]",
"Region": "ap-northeast-2"
}
},
"Auth": {
"Default": {
"OAuth": {
"WebDomain": "[YOUR COGNITO WEB DOMAIN]",
"AppClientId": "[COGNITO USER POOL APP CLIENT ID]",
"AppClientSecret": "[COGNITO USER POOL APP CLIENT SECRET]",
"SignInRedirectURI": "[CUSTOM REDIRECT SCHEME AFTER SIGN IN, e.g. myapp://]",
"SignOutRedirectURI": "[CUSTOM REDIRECT SCHEME AFTER SIGN OUT, e.g. myapp://]",
"Scopes": [
"email",
"openid",
"profile",
"aws.cognito.signin.user.admin"
]
},
"socialProviders": [ // 소셜 로그인 설정
"FACEBOOK",
"GOOGLE",
"APPLE"
],
"authenticationFlowType": "USER_SRP_AUTH"
}
}
}
}
}
}
- CognitoUserPool
- Default
- PoolId -> Amazon Cognito User pool의 id를 입력합니다. (e.g. ap-northeast-2_abcdefghi)
- AppClientId -> Amazon Cognito User pool의 app client id를 입력합니다.
- Region -> 지역을 입력합니다. (e.g. ap-northeast-2)
- Default
- CredentialsProvider -> 자격증명 풀 없이 User pool을 구성하는 경우 생략할 수 있습니다. 여기서는 생략하겠습니다. (자세한 내용은 [AWS] Android에서 Amplify를 이용해 Cognito 자격으로 S3에 업로드하기 포스트에서 확인해주세요.)
- Auth
- Default
- authenticationFlowType -> 인증 흐름 유형을 입력해줍니다. 기본값은 USER_SRP_AUTH 입니다.
- OAuth -> 호스팅된 웹 UI 흐름일 경우에 작성해줍니다.
- WebDomain -> Cognito User pool의 웹 Domain 이름을 입력합니다.
- AppClientId -> Amazon Cognito User pool의 app client id를 입력합니다.
- SignInRedirectURI -> 인증코드를 수신할 웹 어플리케이션의 URL을 입력합니다. 사용자가 로그인하면 여기로 리디렉션됩니다.
- SignOutRedirectURI -> 로그아웃할 때 사용자를 리디렉션할 URI를 입력합니다.
- Scopes -> 사용자가 인증할 때 Amazon Cognito에서 토큰을 추가하게 할 OAuth 범위를 선택합니다.
- socialProviders -> 지원할 소셜 로그인 종류를 리스트에 추가해줍니다. Cognito에서 지원하지 않을 경우 OIDC 설정을 해주어야 합니다. (Naver, Kakao 등등)
- Default
AmplifyManager Amplify 초기화 코드
class AmplifyManager(
private val context: Context,
private val coroutineDispatcher: CoroutineDispatcher = Dispatchers.IO
) {
fun configureAmplify(@RawRes configResourceId: Int) {
try {
Amplify.addPlugin(AWSCognitoAuthPlugin())
Amplify.configure(AmplifyConfiguration.fromConfigFile(context, configResourceId), context)
} catch (e: Exception) {
Log.e(TAG, "amplify configure error", e)
}
}
// ...
companion object {
private val TAG: String = AmplifyManager::class.java.simpleName
}
}
Amplify를 사용하기 전에 초기화를 해주어야 합니다.
초기화 과정에서는 aws_configuration.json파일을 등록하고 AWS Plugin을 등록해줍니다.
AmplifyManager(applicationContext).configureAmplify(R.raw.aws_configuration)
configure() 메소드는 앱의 생명주기동안 한번만 호출해야 하므로 Application에서 초기화하는 것을 권장합니다.
AmplifyManager SignUp / SignIn 코드
class AmplifyManager(
private val context: Context,
) {
// ...
suspend fun login(
email: String,
password: String,
options: AuthSignInOptions = AuthSignInOptions.defaults()
) = suspendCoroutine { continuation: Continuation<Result<AuthSignInResult>> ->
try {
Amplify.Auth.signIn(email, password, options, { authSignInResult ->
when {
authSignInResult.isSignInComplete && authSignInResult.nextStep.signInStep == AuthSignInStep.DONE -> {
continuation.resume(Result.Success(authSignInResult))
}
authSignInResult.isSignInComplete && authSignInResult.nextStep.signInStep != AuthSignInStep.DONE -> {
continuation.resume(Result.Error(AmplifyException.ConfirmSignInNextStepException("Need confirm sign-in next step: ${authSignInResult.nextStep.signInStep}")))
}
else -> {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("Unexpected sign-in exception: $authSignInResult")))
}
}
}, {
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $it")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
suspend fun logout(): Result<Unit> {
return suspendCoroutine { continuation ->
try {
Amplify.Auth.signOut({
continuation.resume(Result.Success(Unit))
}, { authException ->
continuation.resume(Result.Error(authException))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
}
suspend fun signUp(
email: String,
password: String,
options: AuthSignUpOptions = AuthSignUpOptions
.builder()
.build()
) = suspendCoroutine { continuation: Continuation<Result<AuthSignUpResult>> ->
try {
Amplify.Auth.signUp(email, password, options, { authSignUpResult ->
when {
authSignUpResult.isSignUpComplete && authSignUpResult.nextStep.signUpStep == AuthSignUpStep.DONE -> {
continuation.resume(Result.Success(authSignUpResult))
}
authSignUpResult.isSignUpComplete && authSignUpResult.nextStep.signUpStep != AuthSignUpStep.DONE -> {
continuation.resume(Result.Error(AmplifyException.ConfirmSignUpNextStepException("Need confirm sign-up next step: ${authSignUpResult.nextStep.signUpStep}")))
}
else -> {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("Unexpected sign-up exception: $authSignUpResult")))
}
}
}, { authException ->
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $authException")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
suspend fun confirmSignUp(
email: String,
confirmationCode: String
) = suspendCoroutine { continuation: Continuation<Result<AuthSignUpResult>> ->
try {
Amplify.Auth.confirmSignUp(email, confirmationCode, { authSignUpResult ->
when {
authSignUpResult.isSignUpComplete && authSignUpResult.nextStep.signUpStep == AuthSignUpStep.DONE -> {
continuation.resume(Result.Success(authSignUpResult))
}
authSignUpResult.isSignUpComplete && authSignUpResult.nextStep.signUpStep != AuthSignUpStep.DONE -> {
continuation.resume(Result.Error(AmplifyException.ConfirmSignUpNextStepException("Need confirm sign-up step: ${authSignUpResult.nextStep.signUpStep}")))
}
else -> {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("Unexpected confirm sign-up exception: $authSignUpResult")))
}
}
}, {
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $it")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
}
로그인 회원가입에 대한 코드들입니다.
AmplifyManager 토큰 가져오기 코드
class AmplifyManager(
private val context: Context,
) {
suspend fun getIdToken() = suspendCoroutine { continuation: Continuation<Result<String>> ->
try {
Amplify.Auth.fetchAuthSession({ authSession ->
val awsCognitoAuthSession = authSession as AWSCognitoAuthSession
awsCognitoAuthSession.userPoolTokens.value?.accessToken?.let { token ->
continuation.resume(Result.Success(token))
} ?: run {
throw NullPointerException("AWSCognitoAuthSession or idToken is null")
}
}, {
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $it")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
suspend fun getAccessToken() = suspendCoroutine { continuation: Continuation<Result<String>> ->
try {
Amplify.Auth.fetchAuthSession({ authSession ->
val awsCognitoAuthSession = authSession as AWSCognitoAuthSession
awsCognitoAuthSession.userPoolTokens.value?.accessToken?.let { token ->
continuation.resume(Result.Success(token))
} ?: run {
throw NullPointerException("AWSCognitoAuthSession or accessToken is null")
}
}, {
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $it")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
suspend fun getRefreshToken() = suspendCoroutine { continuation: Continuation<Result<String>> ->
try {
Amplify.Auth.fetchAuthSession({ authSession ->
val awsCognitoAuthSession = authSession as AWSCognitoAuthSession
awsCognitoAuthSession.userPoolTokens.value?.refreshToken?.let { token ->
continuation.resume(Result.Success(token))
} ?: run {
throw NullPointerException("AWSCognitoAuthSession or refreshToken is null")
}
}, {
continuation.resume(Result.Error(AmplifyException.AuthException("AuthException: $it")))
})
} catch (exception: Exception) {
continuation.resume(Result.Error(AmplifyException.UnExpectedException("UnExpectedException: $exception")))
}
}
}
idToken
-> idToken은 name, email, phone_umber등에 대한 정보를 포함하여 앱에서 이 ID 정보를 사용할 수 있습니다. JWT 토큰이며 토큰 만료시간은 5분 ~ 1일 사이로 설정할 수 있습니다.
accessToken
-> accessToken을 통해서 User pool의 사용자 컨텍스트에서 API에 대한 Access 권한이 승인됩니다. 예를 들면, 액세스 토큰을 이용해서 사용자에게 사용자 속성을 추가, 변경, 삭제할 수 있는 액세스 권한을 부여할 수 있습니다. 액세스 토큰 만료시간의 최소값은 1시간입니다.
refreshToken
-> refreshToken을 통해 idToken과 accessToekn을 갱신할 수 있습니다. 토큰 만료시간의 디폴트값은 로그인 한 후 30일이 지나면 만료되며, 60분에서 10년 사이의 값으로 설정할 수 있습니다. refreshToken이 만료된 경우에는 User pool에 다시 로그인하여 다시 인증해야 합니다.
실행 결과
1. Sign-up 실행
Amplify.Auth.signUp() 메소드를 실행하게 되면 아마 아래와 같은 에러메시지가 뜰 겁니다.
NotAuthorizedException: SignUp is not permitted for this user pool
이유는 Amplfy.Auth에 있는 메소드로 직접 계정을 등록했기 때문인데, Amazon Cognito에서 이러한 직접적인 접근은 권장하는 방법이 아니기 때문에 설정에서 막혀있습니다. (일반적으로는 서버 API를 통해 회원가입을 진행하도록 만들어서 데이터베이스에 넣는 작업 등을 수행하게 만드는 것이 올바른 방법입니다.)
그러므로 위 사진처럼 User pool -> Sign-up experience에 들어가서 Self-service sign-up을 Enabled로 바꿔주어야 직접 계정등록을 할 수 있습니다.
Self-service sign-up을 설정을 Enabled로 바꾼 뒤에
amplifyManager.signUp()
AmplifyManager의 signUp()을 실행하면 ConfirmSignUpNextStepException이 발생합니다.
회원가입 자체는 성공했지만, 인증절차가 수행되지 않은 경우입니다.
그러므로 이메일, 혹은 핸드폰 등으로 확인절차를 거쳐야합니다.
User pool에 들어가보면 Confirmation status가 Unconfirmed인 상태의 계정이 하나 생성된 것을 확인할 수 있습니다.
User Account Confirmation의 다이어그램
sign-up을 하고 User pool을 만들 때 설정했던 인증절차를 완료하고 Confirmed 상태가 되어야만 sign-in을 할 수 있습니다.
User pool을 생성할 때 이메일주소로 인증절차를 수행하도록 설정했기 때문에 sign-up을 수행하면 확인코드가 이메일로 오게 됩니다.
2. Sign-up confirmation
확인코드를 이메일로 받았으면, 확인코드를 입력해줍니다.
amplifyManager.confirmSignUp()
그러면 confirmSignUp() 메소드에 이메일과 인증코드를 넣고 실행해줍니다.
버튼을 눌러주면 로그캣에서 정상적으로 confirm-sign-up이 성공했다는 로그를 확인하실 수 있습니다.
그리고 User pool에 가보면 Confirmation status가 Confirmed로 바뀌어있는 것을 확인할 수 있습니다.
3. Sign-in 실행
AmplifyManager.login()
인증절차까지 마쳤으므로 AmplifyManager.login()을 실행해줍니다.
그러면, 정상적으로 sign-in이 성공했다는 로그를 확인하실 수 있습니다.
마무리
Amplify CLI를 사용하지 않고 안드로이드 Amplify를 구현하였습니다. 이유는 프로젝트에 안에 amplify 모듈이 생성된다는 점과 CLI로 Amplify를 init하게 되면 User Pool, Identity Pool, AWS Lambda까지 전부 생성이 되는데, 이게 편할 수도 있지만 기존 리소스들을 사용하는 것은 불편함(예를들면, 기존앱에 있던 리소스들을 다른 앱으로 마이그레이션 하는 경우)이 있어서 포스트에서 사용하지 않았고 회사 프로젝트에서도 마찬가지로 사용하지 않았습니다.
CLI를 사용하지 않고도 AWS 콘솔에서도 간단하게 설정이 가능하므로 CLI의 사용여부는 각 프로젝트에 맞게 유연하게 변경해서 사용하시면 될 것 같습니다.
감사합니다!
References
https://docs.amplify.aws/lib/q/platform/android/
https://docs.aws.amazon.com/cognito/latest/developerguide/cognito-user-identity-pools.html