Docs Menu

マルチユーザー アプリケーション - Swift SDK

Realm Swift SDK を使用すると、複数のユーザーが特定のデバイスで同時にアプリにログインできます。 クライアント アプリケーションは、複数のユーザーが同時にログインしている場合でも、単一のアクティブ ユーザーのコンテキストで実行されます。 再度ログインする必要なく、認証されたユーザー間ですばやく切り替えることができます。

重要

ログインしたユーザーは、再認証を行わずに アクティブ ユーザー になる場合があります。 アプリによっては、セキュリティ上の脆弱性がある場合があります。 たとえば、共有デバイス上のユーザーは、認証情報を提供したり明示的な許可を必要とせずに、同僚のログイン アカウントに切り替えることができます。 アプリケーションでより厳格な認証が必要な場合は、ユーザー間の切り替えを避け、別のユーザーを認証する前にアクティブなユーザーを明示的にログアウトすることをおすすめします。

ユーザーが特定のデバイスまたはブラウザで Atlas App Services を通じて初めてログインすると、Realm SDK はユーザーの情報を保存し、デバイス上のユーザーの状態を追跡します。 ログアウトした場合でも、ユーザーをアクティブに削除しない限り、ユーザーのデータはデバイス上に残ります。

次の状態では、ある時点でデバイス上のユーザーを記述します。

  • 認証済み:デバイスにログイン済みで、ログアウトしたことがない、またはセッションが取り消されているユーザー。

    • アクティブ: 特定のデバイスで現在アプリを使用している単一の認証済みユーザー。 SDK はこのユーザーを送信リクエストに関連付け、App Services はデータアクセス権限を評価し、このユーザーのコンテキストで関数を実行します。 詳細については、アクティブ ユーザーを参照してください。

    • 非アクティブ: 現在アクティブなユーザーではない、すべての認証済みユーザー。 現在非アクティブなユーザーにいつでもアクティブなユーザーを切り替えることができます。

  • ログアウト:デバイスで認証されたが、ログアウトされたユーザーまたはセッションが取り消されたユーザー。

以下の図は、特定のイベントが発生したときにクライアントアプリ内のユーザーが状態間でどのように移行するかを示しています。

A diagram the outlines the different states a user can be in: logged out, logged in and active, & logged in and inactive.

Realm SDK は、ユーザーがそのデバイスに初めてログインするときに、そのデバイスにユーザーを自動的に追加します。 ユーザーはログインすると、すぐにアプリケーションのアクティブ ユーザー になります。

let app = App(id: YOUR_APP_SERVICES_APP_ID)
let joeCredentials = Credentials.emailPassword(email: "joe@example.com", password: "passw0rd")
app.login(credentials: joeCredentials) { (result) in
switch result {
case .failure(let error):
print("Login failed: \(error.localizedDescription)")
case .success(let joe):
// The active user is now Joe
assert(joe == app.currentUser)
}
}
let emmaCredentials = Credentials.emailPassword(email: "emma@example.com", password: "pa55word")
app.login(credentials: emmaCredentials) { (result) in
switch result {
case .failure(let error):
print("Login failed: \(error.localizedDescription)")
case .success(let emma):
// The active user is now Joe
assert(emma == app.currentUser)
}
}

デバイスに保存されているすべてのユーザー アカウントのリストにアクセスできます。 このリストには、現在認証されているかどうかに関係なく、特定のデバイス上のアプリにログインしたすべてのユーザーが含まれます。

let app = App(id: YOUR_APP_SERVICES_APP_ID)
let users = app.allUsers
users.forEach({ (key, user) in
print("User: \(key) \(user)")
})

次のコードを使用して、アプリのアクティブ ユーザーを別のログイン ユーザーにいつでも変更できます。

let app = App(id: YOUR_APP_SERVICES_APP_ID)
// ... log in ...
// Get another user on the device, for example with `app.allUsers`
let secondUser: User = getSomeOtherUser()
XCTAssertNotEqual(app.currentUser, secondUser)
// assert(app.currentUser != secondUser)
// Switch to another user
// app.switch(to: secondUser)
// The switch-to user becomes the app.currentUser
// XCTAssertEqual(app.currentUser, secondUser)
// assert(app.currentUser == secondUser)

デバイスからユーザーに関するすべての情報を削除し、ユーザーを自動的にログアウトできます。

app.currentUser?.logOut { (error) in
// user is logged out or there was an error
}