ユーザーの作成と認証 - Kotlin SDK
項目一覧
Atlas App Services にアクセスするには、まず、App Services 認証プロバイダを使用してユーザーを認証する必要があります。 このページでは、Realm Kotlin SDK を使用して App Services App ユーザーを認証する方法について説明します。 詳細については、App Services ドキュメントの「 ユーザーの認証と管理」を参照してください。
重要
Google および Apple アカウントの削除要件
Google と Apple は、それぞれの App Store を通じてリストされるアプリケーションに対して、 アカウントを作成したすべてのユーザーにアカウントを削除するオプションを提供することを義務付けています。メールや パスワード認証など、ユーザーを手動で登録する必要がある認証方法を使用する場合でも、Apple でサインインなどのユーザーを自動的に作成する認証方法を使用する場合でも、 ユーザー アカウントの削除 を実装する必要があります。
App Services ユーザー
Atlas App Services は、ユーザーをクライアント アプリにログインまたはログアウトするための次の組み込み認証プロバイダーを提供します。
匿名ユーザー
メール/パスワードの組み合わせ
API キー
Facebook、Google、Apple ID による OAuth 2.0
カスタム JWT
カスタム関数
ログインが成功すると、App Services はユーザーのユーザー セッションを開始します。 App Services はアクセス トークンとリフレッシュ トークンを使用してセッションを管理します。 Kotlin SDK はトークンを管理し、それらにリクエストを提供するロジックを提供します。 ユーザー セッションとトークンの管理の詳細については、App Services ドキュメントの「ユーザー セッション 」を参照してください。
ログインユーザーを作成すると、次の操作を実行できます。
ユーザーの構成オブジェクトと同期された Realmを開きます
ログイン ユーザーとしてバックエンド関数を実行
ユーザーをログアウトさせます( 「 ユーザーのログアウト 」セクションを参照)
また、1 つのデバイスで複数のユーザーを同時にアプリにログインすることもできます。 詳細については、 「 マルチユーザー アプリケーションの管理 - Kotlin SDK 」を参照してください。
前提条件
Atlas App Services を通じてユーザーを認証するには、1 つ以上の認証プロバイダが有効になっている App Services App が必要です。
認証プロバイダを使用して App Services Appを設定するには、次の手順を実行します。
App Services のドキュメントの「認証プロバイダの有効化と構成」
Tip
複数の認証プロバイダを有効にできます。 ユーザーが複数の方法で認証する場合は、各方法のユーザー ID を 1 つのユーザー アカウントにリンクできます。
ユーザー アカウントの登録と新しいユーザー アカウントの作成
Atlas App Services は、認証プロバイダーに応じて異なる方法でユーザーを登録します。
メール/パスワード認証を使用している場合、ユーザーは認証を行う前に、まずメールとパスワードを登録して確認する必要があります。
Google、 Facebook 、Apple、または カスタムJSON web tokenを使用している場合、登録はこれらのサードパーティ サービスによって処理されます。
匿名認証を使用している場合は、登録する必要はありません。 匿名ユーザーは登録が必要ありません。
ユーザーが初めてアプリに対して正常に認証されると、Atlas App Services は、一意の識別子と プロバイダー固有の ユーザー メタデータ を含む ユーザー オブジェクトを自動的に作成します。App Services が Kotlin SDK を提供するユーザー オブジェクトの詳細については、App Services ドキュメントの「ユーザー メタデータの読み取り」を参照してください。
ユーザーのログイン
ユーザーを認証してアプリにログインするには、まず認証プロバイダーに関連付けられた認証情報を含む認証情報オブジェクトをインスタンス化し、それを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
の例外をスローします。
Tip
user.providerプロパティを通じて、ユーザーのログインに使用される認証プロバイダのタイプを取得できます。 ユーザーが現在ログアウトしている場合、ユーザーのログインに使用された最新のプロバイダーが返されます。
匿名
匿名認証により、ユーザーは永続的な個人情報を保存しない短期間のアカウントでアプリケーションにログインできます。 これを使用して、ユーザーがアカウントにサインアップする前に、またはアプリの開発とテスト中にアプリを試すことができるようにすることがあります。 匿名ユーザーは登録が必要ありません。 詳細については、App Services ドキュメントの「匿名認証」を参照してください。
匿名認証でログインするには、 Credentials.an以降()を呼び出して匿名の認証情報を作成します。 、生成された認証情報を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) }
デフォルトでは、ユーザーがログアウトしていない場合、 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))
メール/パスワード
メール/パスワード認証プロバイダーは、ユーザーがメール ユーザー名とパスワードを使用してアプリケーションにログインすることを可能にします。 詳細については、App Services ドキュメントの「メール/パスワード認証」を参照してください。
重要
メール/パスワード ユーザーは登録が必要です
メール/パスワード認証では、ユーザーが App Services App に認証する前に、ユーザーから提供されたメールとパスワードを登録し、確認する必要があります。 メール/パスワード ユーザーを登録する方法 。
メール/パスワード認証でログインするには、 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 web token認証プロバイダーを使用すると、ユーザーはカスタムJSON web token ( JSON web token )を使用してアプリケーションにログインできます。 JSON web token認証の登録はJSON web tokenプロバイダーによって処理されます。 詳細については、App Services ドキュメントの「カスタムJSON web token認証」を参照してください。
認証を使用してログインするには、 Credentials.jwt() JSON web tokenを呼び出して の認証情報を作成します。JSON web tokenユーザーのJSON web tokenを使用し、生成された認証情報を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 キーを使用してアプリケーションにログインできるようにします。 詳細については、App Services ドキュメントの「 API キー認証」を参照してください。
API キー認証でログインするには、 Credentials.apiKey()を呼び出して API キー認証情報を作成します。 ユーザーの API キーを使用して、生成された認証情報をapp.login()に渡します。
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.apiKey(key)) }
ユーザー API キーは Kotlin SDK によって自動的に生成され、管理されます。 ユーザー API キー - Kotlin SDK を管理する方法を学びます。
カスタム関数
カスタム関数認証プロバイダーを使用すると、ユーザーは Atlas Function によって処理されるカスタム認証ロジックを使用してアプリケーションにログインできます。 詳細については、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を呼び出す方法 - Kotlin SDK .
バージョン 1.9.0 の新機能。
EJSON エンコードを使用して、カスタム関数認証情報のデータをシリアル化できます。 例を含む詳細については、 「 Atlas 用の EJSON エンコーディング 」を参照してください。
Google 認証プロバイダーは、OAuth 2.0トークンを使用して、既存の Google アカウントを通じてユーザーを認証できます。 詳しくは、App Services ドキュメントの「 Google 認証」を参照してください。
Google でユーザーを認証する前に、アプリケーションを Google ユーザー認証用に設定する必要があります。
Google Cloud Platform コンソール で 、OAuth2 を作成します。0「Web アプリケーション」タイプのクライアント 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); } }
Tip
Android 用の Google ログインについて詳しくは、公式の「 Google 統合ガイド 」を参照してください。
Kotlin マルチプラットフォーム(KMIP)は多くの環境をサポートしていますが、この例では Android プラットフォームでのサインインを示しています。 Apple プラットフォームで Google アカウントにログインする方法について詳しくは、「 Swift SDK の例 」を参照してください。
Facebook 認証プロバイダーは、既存の Facebook アカウントを使用して Facebook アプリを通じてユーザーを認証することを可能にします。 詳細については、App Services のドキュメントの「 Facebook 認証」を参照してください。
Facebook でユーザーを認証する前に、公式の 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 に直接アクセスします。
Kotlin マルチプラットフォーム(KMIP)は多くの環境をサポートしていますが、この例では Android プラットフォームでのサインインを示しています。 Apple プラットフォームで Facebook アカウントにサインインする方法の詳細については、「 Swift SDK の例 」を参照してください。
Apple
Sign in with Apple 認証プロバイダーを使用すると、ユーザーは Apple が提供するカスタム トークンを使用してアプリケーションにログインできます。 詳細については、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) }
Kotlin マルチプラットフォーム(KMIP)は多くの環境をサポートしていますが、この例では Android プラットフォームでのサインインを示しています。 Apple プラットフォームで Apple を使用してサインインする方法について詳しくは、「 Swift SDK の例 」を参照してください。
現在のユーザーを取得
App.currentUserプロパティを使用して、現在ログインしているユーザーを検索できます。
val user = app.currentUser
アプリに複数のユーザーがログインしている場合は、ログインした最後の有効なユーザーが返されます。ログインしているユーザーがいない場合はnull
が返されます。 詳細については、 「 マルチユーザー アプリケーションの管理 - Kotlin SDK 」を参照してください。
currentUser
オブジェクトはローカル ストレージに保存されていることに注意してください。そのため、初期認証後にアプリがシャットダウンした場合でも、 logIn
を再度呼び出す必要はありません(ユーザーがログアウトしたり、ユーザー セッションが期限切れになったりしない限り)。
このメソッドを使用して、オフラインでログインしたり、次回のアプリが開いたときにAtlas Function を呼び出したりします。
オフラインでログイン
Realm アプリケーションはユーザーを認証する際、ユーザーの認証情報をキャッシュします。 既存のユーザー認証情報を確認して、ログイン フローをバイパスし、キャッシュされたユーザーにアクセスできます。 これを使用して、Realm をオフラインで開きます。
注意
最初のログインにはネットワーク接続が必要です
ユーザーがアプリにサインアップしたり、クライアントに既存のアカウントを使用して初めてログインする場合、クライアントにはネットワーク接続が必要です。 キャッシュされたユーザー認証情報を確認すると、ユーザーが以前にオンライン時にログインしたことがある場合にのみ、オフラインで 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 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 }
リフレッシュ トークンの有効期限を設定する
リフレッシュ トークンは一定期間後に期限切れになります。 更新トークンの有効期限が切れると、アクセス トークンの更新ができなくなり、ユーザーは再度ログインする必要があります。
Realm が開いた後に更新トークンの有効期限が切れると、ユーザーが再度ログインするまでデバイスは同期できなくなります。 同期エラー ハンドラーには、同期試行時にトークンの期限切れエラーを検出し、ユーザーをログイン フローにリダイレクトするロジックを実装する必要があります。
リフレッシュ トークンの有効期限の設定の詳細については、App Services ドキュメントの「ユーザー セッションの管理」を参照してください。
ユーザーのログアウト
警告
ユーザーがログアウトすると、ユーザーが開いた同期された Realm でデータの読み取りも書き込みもできなくなります。 その結果、開始ユーザーがログアウトする前にまだ完了していない操作は正常に完了できず、エラーが発生する可能性が高くなります。 このように失敗した書込み操作のデータは失われます。
ログインに使用された認証プロバイダに関係なく、 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 との間の同期を直ちに停止します。
匿名ユーザーの場合、 によってユーザーが削除されます。
ログアウトすると同期が停止するため、すべてのローカル Realm の更新がサーバーにアップロードされた後にのみログアウトする必要があります。
認証の変更を監視
バージョン10.8.0の新機能。
App.authenticationCheckAsFlow()を呼び出すと、認証変更イベントのフローを観察できます。 このフローでは、サブクラスとして表される、可能な 3 つの状態の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) } }