사용자 만들기 및 인증 - 코틀린 SDK (Kotlin SDK)
이 페이지의 내용
Atlas App Services 에 액세스 하려면 먼저 App Services 인증 제공자 를 통해 사용자를 인증해야 합니다. 이 페이지에서는 Realm 코틀린 SDK (Kotlin SDK) 를 사용하여 App Services App 사용자를 인증하는 방법을 설명합니다. 자세한 내용은 App Services 문서에서 인증 및 사용자 관리 를 참조하세요.
중요
Google 및 Apple 계정 삭제 요건
Google 및 Apple 에 따라 해당 App Store를 통해 등록된 애플리케이션은 계정을 생성하는 모든 사용자에게 계정을 삭제 수 있는 옵션을 제공해야 합니다. 이메일/비밀번호 인증 과 같이 사용자를 수동으로 등록해야 하는 인증 방법을 사용하든, Sign-In with Apple과 같이 자동으로 사용자를 생성하는 인증 방법을 사용하든,사용자 계정 삭제 를 구현 해야 합니다.
App Services 사용자
Atlas App Services는 클라이언트 앱에서 사용자를 로그인 및 로그아웃할 수 있도록 다음과 같은 기본 제공 인증 제공자를 제공합니다:
익명의 사용자
이메일/비밀번호 조합
API 키
OAuth 2.0 through Facebook, Google 및 Apple ID
사용자 지정 JWT
사용자 지정 기능
로그인에 성공하면 App Services는 사용자에 대한 사용자 세션을 시작합니다. App Services는 액세스 토큰 및 새로 고침 토큰을 사용하여 세션을 관리하고 코틀린 SDK (Kotlin SDK)는 토큰을 관리하고 요청을 제공하는 로직을 제공합니다. 사용자 세션 및 토큰 관리에 대한 자세한 내용은 App Services 문서의 사용자 세션을 참조하세요.
로그인한 사용자가 있으면 다음을 수행할 수 있습니다.
사용자의 구성 객체로 동기화된 영역을 엽니다.
사용자 로그아웃하기( 사용자 로그아웃하기 섹션 참조)
하나의 디바이스에서 여러 사용자를 동시에 앱에 로그인할 수도 있습니다. 자세한 내용은 다중 사용자 애플리케이션 관리- 코틀린 SDK (Kotlin SDK)를 참조하세요.
전제 조건
Atlas App Services를 통해 사용자를 인증하려면 하나 이상의 인증 제공자가 활성화된 App Services 앱이 있어야 합니다.
인증 제공자를 사용하여 App Services 앱을 설정하려면 다음을 완료하세요.
Atlas App Services 문서에서 Authentication Providers 활성화 및 구성 하기
팁
여러 인증 제공자를 활성화하도록 설정할 수 있습니다. 사용자가 두 가지 이상의 방법을 사용하여 인증하는 경우 각 방법의 사용자 ID를 단일 사용자 계정에 연결할 수 있습니다.
새로운 사용자 계정 등록 및 생성
Atlas App Services는 인증 제공자에 따라 사용자를 다르게 등록합니다.
이메일/비밀번호 인증을 사용하는 경우 사용자는 인증하기 전에 먼저 이메일과 비밀번호를 등록하고 확인해야 합니다.
Google, Facebook, Apple 또는 사용자 지정 JWT를 사용하는 경우 등록은 이러한 타사 서비스에서 처리합니다.
익명 인증을 사용하는 경우에는 등록할 필요가 없습니다. 익명 사용자는 등록할 필요가 없습니다.
사용자가 처음으로 앱에 성공적으로 인증하면 Atlas App Services는 고유 식별자 및 제공자별 사용자 메타데이터 가 포함된 사용자 객체를 자동으로 생성합니다. Atlas App Services가 Kotlin SDK 에 제공하는 사용자 객체에 대해 자세히 알아보려면 Atlas App Services 문서에서 사용자 메타데이터 읽기 를 참조하세요.
사용자 로그인
사용자를 인증하고 앱 에 로그인하려면 먼저 인증 제공자와 연결된 자격 증명이 포함된 Credentials 객체를 인스턴스화한 다음 이를 app.login() 에 전달합니다. 각 인증 제공자는 해당 인증 제공자의 Credentials
객체를 인스턴스화하는 데 사용되는 정적 헬퍼 메서드 에 해당합니다.
// Instantiate your App Services App val app = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Log in the user with the credentials associated // with the authentication provider // If successful, returns an authenticated `User` object val user = app.login(credentials) // ... work with the user ... }
성공하면 app.login()
은(는) User
객체를 반환합니다. 오류가 발생하면 app.login()
에서 AppException
유형의 예외가 발생합니다.
팁
user.provider 속성을 통해 사용자 로그인에 사용되는 인증 제공자 유형을 가져올 수 있습니다. 사용자가 현재 로그아웃된 경우 사용자 로그인에 사용된 가장 최근 제공자가 반환됩니다.
익명
익명 인증을 통해 사용자는 영구적인 개인 정보를 저장하지 않는 단기 계정으로 애플리케이션에 로그인할 수 있습니다. 이 기능을 사용하여 사용자가 계정을 등록하기 전에 또는 앱을 개발 및 테스트하는 동안 앱을 사용해 볼 수 있도록 허용할 수 있습니다. 익명 사용자는 등록할 필요가 없습니다 . 자세한 내용은 Atlas App Services 문서의 익명 인증 을 참조하세요.
익명 인증으로 로그인하려면 Credentials.anonymous() 를 호출하여 익명 자격 증명을 생성합니다. 생성된 자격 증명을 app.login()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val anonymousCredentials = Credentials.anonymous() val user = app.login(anonymousCredentials) }
기본적으로 코틀린 SDK (Kotlin SDK)는 해당 사용자가 로그아웃하지 않은 경우 동일한 익명 사용자를 재사용합니다. 익명 사용자를 두 명 이상 생성하려면 추가 익명 자격 증명으로 로그인할 때 reuseExisting = false
을(를) 설정합니다.
// Logs in with an anonymous user val anonUser = app.login(Credentials.anonymous()) // Logs in with a new, different anonymous user val otherAnonUser = app.login(Credentials.anonymous(reuseExisting = false))
이메일/비밀번호
이메일/비밀번호 인증 제공자를 통해 사용자는 이메일 사용자 이름과 비밀번호로 애플리케이션에 로그인할 수 있습니다. 자세한 내용은 Atlas App Services 문서에서 이메일/비밀번호 인증 을 참조하세요.
중요
이메일/비밀번호 사용자는 등록 필요
이메일/비밀번호 인증을 사용하려면 사용자가 App Services 앱에 인증하기 전에 사용자가 제공한 이메일 및 비밀번호를 등록한 다음 확인해야 합니다. 이메일/비밀번호 사용자를 등록하는 방법을 알아보세요.
이메일/비밀번호 인증으로 로그인하려면 Credentials.emailPassword() 를 호출하여 이메일/비밀번호 자격 증명을 사용자의 등록된 이메일과 비밀번호로 생성된 자격 증명을 app.login()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val emailPasswordCredentials = Credentials.emailPassword(email, password) val user = app.login(emailPasswordCredentials) }
사용자 지정 JWT
사용자 지정 JSON 웹 토큰 인증 제공자를 사용하면 사용자가 사용자 지정 JSON web token (JSON 웹 토큰)으로 애플리케이션에 로그인할 수 있습니다. JSON web token 인증 등록은 JSON web token 제공자가 처리합니다. 자세한 내용은 Atlas App Services 문서에서 사용자 지정 JSON web token 인증 을 참조하세요.
JSON 웹 토큰 인증으로 로그인하려면 Credentials.jwt() 를 호출하여 JSON 웹 토큰 자격 증명을 생성합니다. 생성된 자격 증명을 app.login()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Registration is handled by the JWT provider val jwtCredentials = Credentials.jwt(jwtToken) val user = app.login(jwtCredentials) }
API 키
API 키 인증 제공자를 사용하면 인증된 익명이 아닌 사용자가 API 키를 사용하여 애플리케이션에 로그인할 수 있습니다. 자세한 내용은 Atlas App Services 문서의 API 키 인증 을 참조하세요.
API 키 인증으로 로그인하려면 Credentials.apiKey() 를 호출하여 API 키 자격 증명을 생성된 자격 증명을 API ()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.apiKey(key)) }
사용자 API 키는 코틀린 SDK (Kotlin SDK)에 의해 자동으로 생성되고 관리됩니다. 사용자 API 키 관리 방법 - 코틀린 SDK (Kotlin SDK)에 대해 자세히 알아보세요.
사용자 지정 기능
사용자 지정 함수 인증 제공자를 통해 사용자는 Atlas Function에서 처리하는 사용자 지정 인증 로직을 사용하여 애플리케이션에 로그인할 수 있습니다. 자세한 내용은 Atlas App Services 문서의 사용자 지정 함수 인증 을 참조하세요.
사용자 지정 함수 인증으로 로그인하려면 사용자 지정 인수를 Credentials.customFunction() 에 페이로드로 전달합니다. 생성된 자격 증명을 app.login()에 전달합니다.
// Create custom arguments for your Atlas Function val customCredentials = Credentials.customFunction( payload = mapOf("username" to "bob") ) val user = app.login(customCredentials)
Atlas Function 호출 방법 - 코틀린 SDK (Kotlin SDK)에 대해 알아보세요.
버전 1.9.0의 새로운 기능
사용자 지정 함수 자격 증명의 데이터를 EJSON 인코더를 사용하여 직렬화할 수 있습니다. 예시를 포함한 자세한 내용은 Atlas용 EJSON 인코딩을 참조하세요.
Google 인증 제공자를 사용하면 OAuth 2.0 토큰을 사용하여 기존 Google 계정을 통해 사용자를 인증할 수 있습니다. 자세한 내용은 문서에서 Google 인증 Atlas App Services 을 참조하세요.
Google로 사용자를 인증하려면 먼저 Google 사용자 인증을 위한 애플리케이션을 설정해야 합니다.
Google Cloud Platform 콘솔 에서, OAuth 2 를 만듭니다.0 '웹 애플리케이션' 유형의 클라이언트 ID입니다.
해당 클라이언트 ID와 연결된 클라이언트 시크릿을 사용하도록 백엔드 앱을 구성합니다.
백엔드에서 OpenID Connect 활성화
Android용 Google의 공식 로그인 사용 Android 애플리케이션에서 Google 사용자를 인증합니다. 다음 코드는 loginWithGoogle()
에 대한 메서드 호출로 시작하여 이 흐름을 구현합니다.
fun loginWithGoogle() { val gso = GoogleSignInOptions .Builder(GoogleSignInOptions.DEFAULT_SIGN_IN) .requestIdToken("YOUR WEB APPLICATION CLIENT ID FOR GOOGLE AUTH") .build() val googleSignInClient = GoogleSignIn.getClient(activity, gso) val signInIntent: Intent = googleSignInClient.signInIntent val resultLauncher: ActivityResultLauncher<Intent> = // Note: this activity MUST inherit from ComponentActivity or AppCompatActivity to use this API registerForActivityResult(ActivityResultContracts.StartActivityForResult()) { result -> val task: Task<GoogleSignInAccount> = GoogleSignIn.getSignedInAccountFromIntent(result.data) handleSignInResult(task) } resultLauncher.launch(signInIntent) } fun handleSignInResult(completedTask: Task<GoogleSignInAccount>) { try { if (completedTask.isSuccessful) { val account: GoogleSignInAccount? = completedTask.getResult(ApiException::class.java) val token: String = account?.idToken!! val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.google(token, GoogleAuthType.ID_TOKEN)) } } else { Log.e("AUTH", "Google Auth failed: ${completedTask.exception}") } } catch (e: ApiException) { Log.e("AUTH", "Failed to authenticate using Google OAuth: " + e.message); } }
팁
Android용 Google 로그인에 대해 자세히 알아보려면 공식 Android용 Google 로그인 통합 가이드를 확인하세요.
코틀린 멀티플랫폼(KMP)은 많은 환경을 지원하지만 이 예시에서는 Android 플랫폼에서의 로그인을 보여 줍니다. Apple 플랫폼에서 Google 계정에 로그인하는 방법에 대한 자세한 내용은 Swift SDK 예시를 참조하세요.
Facebook 인증 제공자를 사용하면 기존 Facebook 계정을 사용하여 Facebook 앱을 통해 사용자를 인증할 수 있습니다. 자세한 내용은 Atlas App Services 문서에서 Facebook 인증 을 참조하세요.
Facebook으로 사용자를 인증하려면 먼저 공식 Android용 Facebook 로그인 빠른 시작을 따라 애플리케이션에 대한 인증 흐름을 설정해야 합니다.
로그인 완료 핸들러에서 Facebook LoginResult 에서 로그인한 사용자의 액세스 토큰을 가져옵니다. . 액세스 토큰을 사용하여 Credentials.facebook() 을 호출하여 Facebook 자격 증명을 생성합니다. 생성된 자격 증명을 app.login()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID FacebookSdk.setApplicationId(YOUR_FACEBOOK_SDK_APP_ID) FacebookSdk.sdkInitialize(activity) val callbackManager = CallbackManager.Factory.create() LoginManager.getInstance().registerCallback( callbackManager, object : FacebookCallback<LoginResult> { override fun onSuccess(loginResult: LoginResult) { // Signed in successfully, forward credentials to MongoDB Realm. val accessToken = loginResult.accessToken runBlocking { val user = app.login(Credentials.facebook(accessToken.token)) } } override fun onCancel() { Log.v("AUTH", "Cancelled Facebook login") } override fun onError(exception: FacebookException) { Log.e("AUTH", "Failed to authenticate with Facebook: ${exception.message}") } })
중요
Facebook 프로필 사진 URL 저장 안 함
Facebook 프로필 사진 URL에는 이미지 권한을 부여하는 사용자의 액세스 토큰이 포함되어 있습니다. 보안을 위해 사용자의 액세스 토큰이 포함된 URL을 저장하지 마세요. 대신 이미지를 가져와야 할 때 사용자의 메타데이터 필드에서 직접 URL에 액세스합니다.
코틀린 멀티플랫폼(KMP)은 많은 환경을 지원하지만 이 예시에서는 Android 플랫폼에서의 로그인을 보여 줍니다. Apple 플랫폼에서 Facebook 계정에 로그인하는 방법에 대한 자세한 내용은 Swift SDK 예시를 참조하세요.
Apple
Apple 인증 제공자로 로그인을 사용하면 사용자가 Apple에서 제공하는 사용자 지정 토큰을 사용하여 애플리케이션에 로그인할 수 있습니다. 자세한 내용은 Atlas App Services 문서에서 Apple ID 인증 을 참조하세요.
Apple 인증으로 로그인하려면 Credentials.apple() 을 호출하여 Apple 자격 증명을 생성된 자격 증명을 app.login()에 전달합니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { // Registration is handled by Apple val appleCredentials = Credentials.apple(idToken) val user = app.login(appleCredentials) }
코틀린 멀티플랫폼(KMP)은 많은 환경을 지원하지만 이 예시에서는 Android 플랫폼에서의 로그인을 보여 줍니다. Apple 플랫폼에서 Apple로 로그인하는 방법에 대한 자세한 내용은 Swift SDK 예시를 참조하세요.
현재 사용자 조회
App.currentUser 속성을 사용하여 현재 로그인한 사용자를 검색할 수 있습니다.
val user = app.currentUser
앱에 로그인한 사용자가 여러 명인 경우 마지막으로 로그인한 유효한 사용자를 반환하고 로그인한 사용자가 없는 경우 null
을(를) 반환합니다. 자세한 내용은 다중 사용자 애플리케이션 관리 - Kotlin SDK를 참조하세요.
currentUser
객체는 로컬 저장소에 유지됩니다. 따라서 초기 인증 후 앱이 종료되더라도 사용자가 로그아웃했거나 사용자 세션이 만료되지 않는 한 logIn
을(를) 다시 호출할 필요가 없습니다.
이 방법을 사용하여 오프라인으로 로그인하거나 후속 앱이 열릴 때 Atlas Function를 호출할 수 있습니다.
오프라인 로그인
Realm 애플리케이션이 사용자를 인증하면 사용자의 자격 증명을 캐시합니다. 기존 사용자 자격 증명을 확인하여 로그인 흐름을 우회하고 캐시된 사용자에 액세스할 수 있습니다. 이 기능을 사용하여 오프라인에서 영역을 열 수 있습니다.
참고
최초 로그인 시에는 네트워크 연결이 필요합니다.
사용자가 앱에 가입하거나 클라이언트의 기존 계정으로 처음으로 로그인하는 경우 클라이언트가 네트워크에 연결되어 있어야 합니다. 캐시된 사용자 자격 증명을 확인하면 오프라인에서 영역을 열 수 있지만 이는 사용자가 이전에 온라인 상태에서 로그인한 적이 있는 경우에만 가능합니다.
// You can only open a synced realm offline if there is a cached user credential. If // there is no app.currentUser, you must log them in, which requires a network connection. if (app.currentUser == null) { app.login(Credentials.emailPassword(email, password)) } // If the app.currentUser isn't null, you can use the cached credential to open the synced // realm even if the user is offline. val user = app.currentUser!! val realm = Realm.open(config) // Query the realm we opened, and see that it contains data val offlineToads: RealmResults<Toad> = realm.query<Toad>().find() Log.v("After opening a realm offline, offlineToads.size is ${offlineToads.size}") realm.close()
사용자 토큰 관리
Realm 코틀린 SDK (Kotlin SDK)는 액세스 토큰을 자동으로 관리하고 만료되면 갱신하며 각 요청마다 현재 사용자에 대한 유효한 액세스 토큰을 포함합니다. 토큰은 사용자가 로그아웃한 후 제거됩니다.
중요
Realm 사용자의 액세스 토큰만 새로 고칩니다. Realm은 새로 고침 토큰을 자동으로 갱신 하지 않습니다. 새로 고침 토큰이 만료되면 SDK는 더 이상 업데이트된 액세스 토큰을 가져올 수 없으며 사용자가 다시 로그인할 때까지 디바이스를 동기화할 수 없습니다.
사용자 세션 액세스 및 토큰 새로 고침에 대한 자세한 내용은 App Services 문서의 사용자 세션을 참조하세요.
사용자 액세스 토큰 받기
user.accessToken 속성을 사용하여 로그인한 사용자의 현재 액세스 토큰을 가져올 수 있습니다.
val token = user.accessToken
SDK 외부로 요청을 보내는 경우 각 요청에 사용자의 액세스 토큰을 포함하고 토큰이 만료되면 수동으로 새로 고쳐야 합니다. 액세스 토큰은 사용자가 로그인한 후 30 분 후에 만료됩니다.
user.refreshToken 을 사용하여 로그인한 사용자의 현재 새로 고침 토큰을 가져올 수 있습니다. 새 액세스 토큰을 요청하는 데 사용할 수 있는 속성입니다.
// Gets the current refresh token for the user fun getRefreshToken(): String { return user.refreshToken }
토큰 만료 새로 고침 구성
새로 고침 토큰은 일정 시간이 지나면 만료됩니다. 새로 고침 토큰이 만료되면 액세스 토큰을 더 이상 새로 고칠 수 없으며 사용자는 다시 로그인해야 합니다.
영역이 열린 후 새로 고침 토큰이 만료되면 사용자가 다시 로그인할 때까지 장치를 동기화할 수 없습니다. 동기화 오류 처리기는 동기화를 시도할 때 토큰 만료 오류를 포착한 다음 사용자를 로그인 흐름으로 리디렉션하는 로직을 구현해야 합니다.
새로 고침 토큰 만료 구성에 대한 자세한 내용은 App Services 문서에서 사용자 세션 관리를 참조하세요.
사용자 로그아웃
경고
사용자가 로그아웃하면 사용자가 연 동기화된 영역에서 더 이상 데이터를 읽거나 쓸 수 없습니다. 따라서 최초 사용자가 로그아웃하기 전에 아직 완료되지 않은 작업이 성공적으로 완료되지 않으며 오류가 발생할 수 있습니다. 이러한 방식으로 실패한 쓰기 작업의 모든 데이터는 손실됩니다.
로그인에 사용된 인증 제공자와 관계없이 user.logOut()을 사용하여 모든 사용자를 로그아웃할 수 있습니다.
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(credentials) // ... work with logged-in user ... // Ensure all local updates are uploaded // before logging out user.logOut() }
user.logOut()
메서드
장치에서 로컬로 저장된 사용자 자격 증명을 삭제합니다.
사용자 영역과의 모든 동기화를 즉시 중지합니다.
익명 사용자의 경우 사용자를 제거합니다.
로그아웃하면 동기화가 중단되므로 모든 로컬 Realm 업데이트가 서버에 업로드된 후에만 로그아웃해야 합니다.
인증 변경 사항 관찰
버전 10.8.0의 새로운 기능
App.authenticationChangeAsFlow() 를 호출하여 인증 변경 이벤트의 흐름을 관찰할 수 있습니다. 이 흐름은 하위 클래스로 표시되는 세 가지 가능한 상태의 AuthenticationChange 이벤트를 내보냅니다.
LoggedIn
: 사용자가 앱에 로그인합니다.LoggedOut
: 사용자가 앱에서 로그아웃합니다.Removed
: 사용자가 앱에서 제거되고 로그아웃됩니다.
이러한 이벤트에는 로그인, 로그아웃 또는 제거된 User
객체에 대한 참조를 제공하는 user
속성이 포함되어 있습니다.
// Create a Flow of AuthenticationChange objects app.authenticationChangeAsFlow().collect { change: AuthenticationChange -> when (change) { is LoggedIn -> proceedToAppActivity(change.user) is LoggedOut -> proceedToLoginActivity(change.user) is Removed -> proceedToRemovedUserActivity(change.user) } }