Docs Menu
Docs Home
/ /
Atlas Device SDK
/ /

ユーザーの作成と認証 - Kotlin SDK

項目一覧

  • App Services ユーザー
  • 前提条件
  • ユーザー アカウントの登録と新しいユーザー アカウントの作成
  • ユーザーのログイン
  • 匿名
  • メール/パスワード
  • カスタム JWT
  • API キー
  • カスタム関数
  • Google
  • Facebook
  • Apple
  • 現在のユーザーを取得
  • オフラインでログイン
  • ユーザー トークンの管理
  • ユーザー アクセス トークンを取得する
  • リフレッシュ トークンの有効期限を設定する
  • ユーザーのログアウト
  • 認証の変更を監視

Atlas App Services にアクセスするには、まず、App Services 認証プロバイダを使用してユーザーを認証する必要があります。 このページでは、Realm Kotlin SDK を使用して App Services App ユーザーを認証する方法について説明します。 詳細については、App Services ドキュメントの「 ユーザーの認証と管理」を参照してください。

重要

Google および Apple アカウントの削除要件

Google Apple は、それぞれの App Store を通じてリストされるアプリケーションに対して、 アカウントを作成したすべてのユーザーにアカウントを削除するオプションを提供することを義務付けています。メールや パスワード認証など、ユーザーを手動で登録する必要がある認証方法を使用する場合でも、Apple でサインインなどのユーザーを自動的に作成する認証方法を使用する場合でも、 ユーザー アカウントの削除 を実装する必要があります。

Atlas App Services は、ユーザーをクライアント アプリにログインまたはログアウトするための次の組み込み認証プロバイダーを提供します。

  • 匿名ユーザー

  • メール/パスワードの組み合わせ

  • API キー

  • Facebook、Google、Apple ID による OAuth 2.0

  • カスタム JWT

  • カスタム関数

ログインが成功すると、App Services はユーザーのユーザー セッションを開始します。 App Services はアクセス トークンとリフレッシュ トークンを使用してセッションを管理します。 Kotlin SDK はトークンを管理し、それらにリクエストを提供するロジックを提供します。 ユーザー セッションとトークンの管理の詳細については、App Services ドキュメントの「ユーザー セッション 」を参照してください。

ログインユーザーを作成すると、次の操作を実行できます。

また、1 つのデバイスで複数のユーザーを同時にアプリにログインすることもできます。 詳細については、 「 マルチユーザー アプリケーションの管理 - Kotlin SDK 」を参照してください。

Atlas App Services を通じてユーザーを認証するには、1 つ以上の認証プロバイダが有効になっている App Services App が必要です。

認証プロバイダを使用して App Services Appを設定するには、次の手順を実行します。

  1. Atlas App Services へのアプリの接続

  2. 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)
}

カスタム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 キーを使用してアプリケーションにログインできるようにします。 詳細については、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 ユーザー認証用に設定する必要があります。

  1. Google Cloud Platform コンソール で 、OAuth2 を作成します。0「Web アプリケーション」タイプのクライアント ID。

  2. そのクライアント ID と関連付けられたクライアントシークレットを使用するようにバックエンド アプリを構成します。

  3. バックエンドで 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 の例 」を参照してください。

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)
}
}

戻る

ユーザーの管理