자습서: 기본 인증을 사용하여 Android 앱에서 로그인 추가
이 자습서에서는 기본 인증을 사용하여 Android 모바일 앱에서 메일 일회용 암호 또는 사용자 이름과 암호를 사용하여 사용자를 로그인하고 로그아웃하는 방법을 보여 줍니다.
이 자습서에서는 다음을 하는 방법을 알아볼 수 있습니다.
- 메일 일회용 암호 또는 사용자 이름(메일)과 암호를 사용하여 사용자를 로그인합니다.
- 사용자를 로그아웃합니다.
- 로그인 오류 처리
필수 조건
- 자습서: 기본 인증을 위한 Android 앱 준비의 단계를 완료합니다. 이 자습서에서는 기본 인증을 위해 Android 프로젝트 또는 앱을 준비하는 방법을 보여 줍니다.
사용자 로그인
일회용 암호를 사용하여 사용자를 로그인하려면 메일을 수집하고 사용자가 메일을 확인할 수 있도록 일회용 암호가 포함된 메일을 보냅니다. 사용자가 유효한 일회용 암호를 입력하면 앱에서 사용자가 로그인됩니다.
사용자 이름(메일) 및 암호를 사용하여 사용자를 로그인하려면 사용자로부터 메일 및 암호를 수집합니다. 사용자 이름과 암호가 유효한 경우 앱에서 사용자가 로그인됩니다.
사용자를 로그인하려면 다음을 수행해야 합니다.
다음을 위한 UI(사용자 인터페이스)를 만듭니다.
- 사용자로부터 메일을 수집합니다. 사용자가 유효한 메일 주소를 입력했는지 확인하기 위해 입력에 대해 유효성 검사를 추가합니다.
- 사용자 이름(메일)과 암호로 로그인하는 경우 암호를 수집합니다.
- 메일 일회용 암호로 로그인하는 경우 사용자로부터 메일 일회용 암호를 수집합니다.
- 메일 일회용 암호로 로그인하는 경우 일회용 암호를 다시 보냅니다(권장).
UI에서 다음 코드 조각과 같이 선택 이벤트가 로그인을 시작하는 단추를 추가합니다.
CoroutineScope(Dispatchers.Main).launch { val actionResult = authClient.signIn( username = emailAddress //password = password, Pass 'password' param if you sign in with username (email) and password ) if (actionResult is SignInResult.CodeRequired) { val nextState = actionResult.nextState val submitCodeActionResult = nextState.submitCode( code = code ) if (submitCodeActionResult is SignInResult.Complete){ // Handle sign in success val accountState = submitCodeActionResult.resultValue val accessTokenResult = accountState.getAccessToken() if (accessTokenResult is GetAccessTokenResult.Complete) { val accessToken = accessTokenResult.resultValue.accessToken val idToken = accountState.getIdToken() } } } }
사용자가 메일 및 암호로 로그인하는 경우처럼 암호를 제출할 필요가 없으면 다음 코드 조각을 사용합니다.
CoroutineScope(Dispatchers.Main).launch { val actionResult = authClient.signIn( username = emailAddress, password = password ) if (actionResult is SignInResult.Complete) -> { // Handle sign in success val accountState = actionResult.resultValue val accessTokenResult = accountState.getAccessToken() if (accessTokenResult is GetAccessTokenResult.Complete) { val accessToken = accessTokenResult.resultValue.accessToken val idToken = accountState.getIdToken() } } }
- 로그인 흐름을 시작하려면 SDK의
signIn(username)
또는signIn(username, password)
메서드를 사용합니다. - 메서드의 매개 변수
username
은 사용자로부터 수집한 메일 주소입니다. - 로그인 메서드가 사용자 이름(메일) 및 암호인 경우 메서드의 매개 변수
password
는 사용자로부터 수집한 암호입니다. - 가장 일반적인 시나리오에서
signIn(username)
또는signIn(username, password)
은 SDK가 앱이 사용자의 메일 주소로 전송된 메일 일회용 암호를 제출할 것으로 예상함을 나타내는 결과SignInResult.CodeRequired
를 반환합니다. SignInResult.CodeRequired
개체에는actionResult.nextState
를 통해 검색할 수 있는 새로운 상태 참조가 포함되어 있습니다.- 새로운 상태를 통해 두 가지 새로운 메서드에 액세스할 수 있습니다.
submitCode()
는 앱이 사용자로부터 수집하는 메일 일회용 암호를 제출합니다.- 사용자가 코드를 받지 못한 경우
resendCode()
는 메일 일회용 암호를 다시 보냅니다.
- 로그인 흐름을 시작하려면 SDK의
로그인 오류 처리
로그인하는 동안 모든 작업이 성공하는 것은 아닙니다. 예를 들어 사용자가 존재하지 않는 메일 주소로 로그인하거나 잘못된 코드를 제출하려고 할 수 있습니다.
로그인 시작 오류 처리
signIn(username)
또는 signIn(username, password)
메서드에 대한 오류를 처리하려면 다음 코드 조각을 사용합니다.
val actionResult = authClient.sign(
username = emailAddress
//password = password, Pass 'password' param if you sign in with username (email) and password
)
if (actionResult is SignInResult.CodeRequired) {
// Next step: submit code
} else if (actionResult is SignInError) {
// Handle sign in errors
when {
actionResult.isUserNotFound() -> {
// Handle "user not found" error
}
actionResult.isAuthNotSupported() -> {
// Handle "authentication type not support" error
}
actionResult.isInvalidCredentials() -> {
// Handle specific errors
}
else -> {
// Handle other errors
}
}
}
SignInError
는signIn()
에서 반환한 실패한 작업 결과를 나타내므로 작업 결과에 새 상태에 대한 참조는 포함되지 않습니다.actionResult is SignUpError
의 경우 Android SDK는 특정 오류를 추가로 분석할 수 있는 다음과 같은 유틸리티 메서드를 제공합니다.- 이 메서드
isUserNotFound()
는 사용자가 존재하지 않는 사용자 이름(메일 주소)으로 로그인하는지 여부를 확인합니다. - 메서드
isBrowserRequired()
는 인증 흐름을 완료하기 위해 브라우저(웹 대체)가 필요한지 확인합니다. 이 시나리오는 기본 인증이 인증 흐름을 완료하는 데 충분하지 않을 때 발생합니다. 예를 들어, 관리자가 인증 방법으로 메일과 암호를 구성했지만 앱이 질문 형식으로 암호를 보내지 못하거나 이를 지원하지 않는 경우가 있습니다. 이러한 상황이 발생하면 Android 앱에서 웹 대체 지원의 단계에서 시나리오를 처리합니다. - 메서드
isAuthNotSupported()
는 앱이 Microsoft Entra가 지원하지 않는 챌린지 유형, 즉 oob 및 password가 아닌 챌린지 유형 값을 전송하는지 확인합니다. 챌린지 유형에 대해 자세히 알아봅니다. - 사용자 이름(메일) 및 암호 로그인의 경우 메서드
isInvalidCredentials()
는 사용자 이름과 암호의 조합이 잘못되었는지 여부를 확인합니다.
- 이 메서드
코드 제출 오류 처리
submitCode()
메서드에 대한 오류를 처리하려면 다음 코드 조각을 사용합니다.
val submitCodeActionResult = nextState.submitCode(
code = code
)
if (submitCodeActionResult is SignInResult.Complete) {
// Sign in flow complete, handle success state.
} else if (submitCodeActionResult is SubmitCodeError && submitCodeActionResult.isInvalidCode()) {
// Handle "invalid code" error
}
SubmitCodeError
오류는submitCode()
에서 반환된 실패한 작업 결과를 나타내므로 작업 결과에 새 상태에 대한 참조가 포함되지 않습니다.isInvalidCode()
는 특정 오류를 확인합니다. 이 경우 작업을 다시 수행하려면 이전 상태 참조를 사용해야 합니다.
새 메일 일회용 암호를 검색하려면 다음 코드 조각을 사용합니다.
val submitCodeActionResult = nextState.submitCode(
code = code
)
if (submitCodeActionResult is SignInError && submitCodeActionResult.isInvalidCode) {
// Inform the user that the submitted code was incorrect or invalid, then ask them to input a new email one-time passcode
val newCode = retrieveNewCode()
nextState.submitCode(
code = newCode
)
}
사용자가 앱에서 성공적으로 로그인하는 데 필요한 모든 단계를 완료했습니다. 애플리케이션을 빌드하고 실행합니다. 모두 문제가 없는 경우 메일을 제공하고, 메일에 코드를 수신하고, 이를 사용하여 사용자를 성공적으로 로그인할 수 있어야 합니다.
ID 토큰 클레임 읽기
앱이 ID 토큰을 획득하면 현재 계정과 연결된 클레임을 검색할 수 있습니다. 이렇게 하려면 다음 코드 조각을 사용합니다.
val preferredUsername = accountState.getClaims()?.get("preferred_username")
val city = accountState.getClaims()?.get("City")
val givenName = accountState.getClaims()?.get("given_name")
//custom attribute
val loyaltyNumber = accountState.getClaims()?.get("loyaltyNumber")
클레임 값에 액세스하는 데 사용하는 키는 사용자 특성을 토큰 클레임으로 추가할 때 지정하는 이름입니다.
토큰 클레임에 사용자 특성 추가 문서에서 기본 제공 및 사용자 지정 특성을 토큰 클레임으로 추가하는 방법을 알아봅니다.
사용자 로그아웃
사용자를 로그아웃하려면 현재 캐시에 저장된 계정을 제거해야 합니다.
다음을 포함하는 사용자 지정 UI(사용자 인터페이스)를 만듭니다.
- 사용자가 로그아웃 요청을 보내기 위해 선택하는 로그아웃 단추입니다.
사용자를 로그아웃하려면 다음 코드를 사용합니다.
private fun performSignOut(accountState: AccountState) { CoroutineScope(Dispatchers.Main).launch { val accountResult = authClient.getCurrentAccount() if (accountResult is GetAccountResult.AccountFound) { val signOutResult = accountResult.resultValue.signOut() if (signOutResult is SignOutResult.Complete) { // Show sign out successful UI } } } }
로그아웃 오류 처리
로그아웃은 오류가 없어야 합니다. 오류가 발생하면 다음 코드 조각을 사용하여 오류 결과를 검사합니다.
val actionResult = accountResult.signOut()
if (actionResult is SignOutResult.Complete) {
// Show sign out successful UI
} else {
// Handle errors
}
import 문을 포함했는지 확인합니다. Android Studio에는 import 문이 자동으로 포함되어야 합니다.
사용자가 앱에서 성공적으로 로그아웃하는 데 필요한 모든 단계를 완료했습니다. 애플리케이션을 빌드하고 실행합니다. 모두 문제가 없는 경우 로그아웃 단추를 선택하여 성공적으로 로그아웃할 수 있습니다.
사용자 지정 클레임 공급자 구성
외부 시스템의 클레임을 앱에 발급되는 토큰에 추가하려면 사용자 지정 클레임 공급자를 사용합니다. 사용자 지정 클레임 공급자는 외부 시스템에서 클레임을 페치하기 위해 외부 REST API를 호출하는 사용자 지정 인증 확장으로 구성됩니다.
사용자 지정 클레임 공급자 구성의 단계에 따라 외부 시스템의 클레임을 보안 토큰에 추가합니다.