diff --git a/source/includes/api-details/csharp/users/multi-user-applications-add-user-to-device-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-add-user-to-device-description.rst new file mode 100644 index 0000000000..c1bb97cc31 --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-add-user-to-device-description.rst @@ -0,0 +1,3 @@ +In the example below, a user with the email ``aimee@example.com`` logs in and +becomes the active user. Later, a user with the email ``elvis@example.com`` +logs in and becomes the active user. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-change-active-user-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-change-active-user-description.rst new file mode 100644 index 0000000000..fecf495053 --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-change-active-user-description.rst @@ -0,0 +1,3 @@ +To change the active user, call +:dotnet-sdk:`SwitchUser() +`. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-check-user-state-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-check-user-state-description.rst new file mode 100644 index 0000000000..cf7b3c8fcf --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-check-user-state-description.rst @@ -0,0 +1,5 @@ +You can check the user's state through the :dotnet-sdk:`User.State +` property. This +property's value is a :dotnet-sdk:`UserState +` enum whose values indicate +whether the user is ``LoggedOut``, ``LoggedIn``, or ``Removed``. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-get-active-user-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-get-active-user-description.rst new file mode 100644 index 0000000000..c41ab7d021 --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-get-active-user-description.rst @@ -0,0 +1,3 @@ +You can get the current active user through the +:dotnet-sdk:`App.CurrentUser +` property. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-list-all-users-on-device-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-list-all-users-on-device-description.rst new file mode 100644 index 0000000000..d7df0b81ce --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-list-all-users-on-device-description.rst @@ -0,0 +1,3 @@ +To list all users on the device, read the +:dotnet-sdk:`App.AllUsers ` +property. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-log-user-out-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-log-user-out-description.rst new file mode 100644 index 0000000000..c0bb1efa32 --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-log-user-out-description.rst @@ -0,0 +1,2 @@ +To log out a logged-in user, call :dotnet-sdk:`User.LogOutAsync() +`. diff --git a/source/includes/api-details/csharp/users/multi-user-applications-remove-user-from-device-description.rst b/source/includes/api-details/csharp/users/multi-user-applications-remove-user-from-device-description.rst new file mode 100644 index 0000000000..cb0eadd9bb --- /dev/null +++ b/source/includes/api-details/csharp/users/multi-user-applications-remove-user-from-device-description.rst @@ -0,0 +1,3 @@ +To log out and remove the user, call +:dotnet-sdk:`RemoveUserAsync() +`. diff --git a/source/includes/api-details/dart/users/multi-user-applications-change-active-user-description.rst b/source/includes/api-details/dart/users/multi-user-applications-change-active-user-description.rst new file mode 100644 index 0000000000..aede4550a4 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-change-active-user-description.rst @@ -0,0 +1,2 @@ +To change the active user, call :flutter-sdk:`app.switchUser() +` on the ``User`` object you are switching to: diff --git a/source/includes/api-details/dart/users/multi-user-applications-check-user-state-description.rst b/source/includes/api-details/dart/users/multi-user-applications-check-user-state-description.rst new file mode 100644 index 0000000000..bcf7856594 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-check-user-state-description.rst @@ -0,0 +1,4 @@ +You can check the user's state through the :flutter-sdk:`User.state +` property. This property's value is a +:flutter-sdk:`UserState ` enum whose values indicate +whether the user is ``loggedOut``, ``loggedIn``, or ``removed``. diff --git a/source/includes/api-details/dart/users/multi-user-applications-get-active-user-description.rst b/source/includes/api-details/dart/users/multi-user-applications-get-active-user-description.rst new file mode 100644 index 0000000000..e52a18b381 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-get-active-user-description.rst @@ -0,0 +1,2 @@ +You can get the current active user through the +:flutter-sdk:`App.currentUser ` property. diff --git a/source/includes/api-details/dart/users/multi-user-applications-list-all-users-on-device-description.rst b/source/includes/api-details/dart/users/multi-user-applications-list-all-users-on-device-description.rst new file mode 100644 index 0000000000..b42f117d96 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-list-all-users-on-device-description.rst @@ -0,0 +1,4 @@ +To list users on the device, read your app's :flutter-sdk:`App.users +` property. This provides access to an +`Iterable `__ +that includes all users that have logged in to the client app. diff --git a/source/includes/api-details/dart/users/multi-user-applications-log-user-out-description.rst b/source/includes/api-details/dart/users/multi-user-applications-log-user-out-description.rst new file mode 100644 index 0000000000..de09866576 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-log-user-out-description.rst @@ -0,0 +1,2 @@ +To log out a logged-in user, call the :flutter-sdk:`user.logOut() +` method. diff --git a/source/includes/api-details/dart/users/multi-user-applications-remove-user-from-device-description.rst b/source/includes/api-details/dart/users/multi-user-applications-remove-user-from-device-description.rst new file mode 100644 index 0000000000..2c5a2a6682 --- /dev/null +++ b/source/includes/api-details/dart/users/multi-user-applications-remove-user-from-device-description.rst @@ -0,0 +1,2 @@ +To log out and remove the user, pass the ``User`` object to +:flutter-sdk:`app.removeUser() `. diff --git a/source/includes/api-details/java/users/multi-user-applications-add-user-to-device-description.rst b/source/includes/api-details/java/users/multi-user-applications-add-user-to-device-description.rst new file mode 100644 index 0000000000..25ad77e4d5 --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-add-user-to-device-description.rst @@ -0,0 +1,2 @@ +In the example below, a user named Joe logs in and becomes the active user. +Later, a user named Emma logs in and becomes the active user. diff --git a/source/includes/api-details/java/users/multi-user-applications-change-active-user-description.rst b/source/includes/api-details/java/users/multi-user-applications-change-active-user-description.rst new file mode 100644 index 0000000000..e4dd0b8461 --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-change-active-user-description.rst @@ -0,0 +1,3 @@ +To change the active user, call :java-sdk:`App.switchUser() +` with the new +user's ``User`` object. diff --git a/source/includes/api-details/java/users/multi-user-applications-check-user-state-description.rst b/source/includes/api-details/java/users/multi-user-applications-check-user-state-description.rst new file mode 100644 index 0000000000..01d1861970 --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-check-user-state-description.rst @@ -0,0 +1,5 @@ +You can check the user's state by calling the :java-sdk:`User.getState() +` method. This +property's value is a :java-sdk:`User.State +` enum whose values indicate +whether the user is ``LOGGED_IN``, ``REMOVED``, or ``LOGGED_OUT``. diff --git a/source/includes/api-details/java/users/multi-user-applications-get-active-user-description.rst b/source/includes/api-details/java/users/multi-user-applications-get-active-user-description.rst new file mode 100644 index 0000000000..8fc3a49b0a --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-get-active-user-description.rst @@ -0,0 +1,2 @@ +You can get the current active user by calling the +:java-sdk:`App.currentUser() ` method. diff --git a/source/includes/api-details/java/users/multi-user-applications-list-all-users-on-device-description.rst b/source/includes/api-details/java/users/multi-user-applications-list-all-users-on-device-description.rst new file mode 100644 index 0000000000..a831c49915 --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-list-all-users-on-device-description.rst @@ -0,0 +1,2 @@ +To list all users on the device, call the +:java-sdk:`App.allUsers() ` method. diff --git a/source/includes/api-details/java/users/multi-user-applications-log-user-out-description.rst b/source/includes/api-details/java/users/multi-user-applications-log-user-out-description.rst new file mode 100644 index 0000000000..84df266845 --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-log-user-out-description.rst @@ -0,0 +1,3 @@ +To log the user out, call :java-sdk:`User.logOut() +` or :java-sdk:`User.logOutAsync() +`. diff --git a/source/includes/api-details/java/users/multi-user-applications-remove-user-from-device-description.rst b/source/includes/api-details/java/users/multi-user-applications-remove-user-from-device-description.rst new file mode 100644 index 0000000000..0d7c87012c --- /dev/null +++ b/source/includes/api-details/java/users/multi-user-applications-remove-user-from-device-description.rst @@ -0,0 +1,4 @@ +To remove all information about a user from a device, +use :java-sdk:`user.remove() ` +or :java-sdk:`user.removeAsync() +`. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-add-user-to-device-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-add-user-to-device-js-ts-description.rst new file mode 100644 index 0000000000..e352836d65 --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-add-user-to-device-js-ts-description.rst @@ -0,0 +1,3 @@ +In the example below, a user with the email ``joe@example.com`` logs in and +becomes the active user. Later, a user with the email ``emma@example.com`` +logs in and becomes the active user. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-change-active-user-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-change-active-user-js-ts-description.rst new file mode 100644 index 0000000000..05082e792a --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-change-active-user-js-ts-description.rst @@ -0,0 +1,3 @@ +In the example below, the active user is initially switched to ``user1`` +using the :js-sdk:`Realm.App.switchUser() ` method. +Later, the active user is switched to ``user2``. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-check-user-state-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-check-user-state-js-ts-description.rst new file mode 100644 index 0000000000..c49e91e5a6 --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-check-user-state-js-ts-description.rst @@ -0,0 +1,4 @@ +You can check the user's state through the :js-sdk:`User.state +` property. This property's value is a +:js-sdk:`UserState ` enum whose values indicate +whether the user is ``LoggedIn``, ``LoggedOut``, or ``Removed``. \ No newline at end of file diff --git a/source/includes/api-details/javascript/users/multi-user-applications-get-active-user-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-get-active-user-js-ts-description.rst new file mode 100644 index 0000000000..eaf7e08046 --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-get-active-user-js-ts-description.rst @@ -0,0 +1,2 @@ +You can get the current active user through the +:js-sdk:`App.currentUser() ` accessor. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-list-all-users-on-device-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-list-all-users-on-device-js-ts-description.rst new file mode 100644 index 0000000000..a39aa2d3f8 --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-list-all-users-on-device-js-ts-description.rst @@ -0,0 +1,3 @@ +In the example below, a developer prints out all the logged-in users on the +device by looping through :js-sdk:`Realm.App.allUsers +`. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-log-user-out-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-log-user-out-js-ts-description.rst new file mode 100644 index 0000000000..b31fef8fdc --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-log-user-out-js-ts-description.rst @@ -0,0 +1,2 @@ +To log out a logged-in user, call the :js-sdk:`User.logOut() +` method. diff --git a/source/includes/api-details/javascript/users/multi-user-applications-remove-user-from-device-js-ts-description.rst b/source/includes/api-details/javascript/users/multi-user-applications-remove-user-from-device-js-ts-description.rst new file mode 100644 index 0000000000..f5b1590adb --- /dev/null +++ b/source/includes/api-details/javascript/users/multi-user-applications-remove-user-from-device-js-ts-description.rst @@ -0,0 +1,2 @@ +In the example below, the current user is removed from the device using the +:js-sdk:`Realm.App.removeUser() ` method. diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-add-user-to-device-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-add-user-to-device-description.rst new file mode 100644 index 0000000000..888091f83f --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-add-user-to-device-description.rst @@ -0,0 +1,2 @@ +In the following example, Joe logs in to the app and becomes the +active user. Then, Emma logs in and replaces Joe as the active user. diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-change-active-user-not-supported.rst b/source/includes/api-details/kotlin/users/multi-user-applications-change-active-user-not-supported.rst new file mode 100644 index 0000000000..7c97773431 --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-change-active-user-not-supported.rst @@ -0,0 +1 @@ +Kotlin does not currently provide a method to switch users. \ No newline at end of file diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-check-user-state-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-check-user-state-description.rst new file mode 100644 index 0000000000..ee57440770 --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-check-user-state-description.rst @@ -0,0 +1,4 @@ +To check the user state, read the +:kotlin-sync-sdk:`user.state +` property. This property is +an enum whose values can be ``LOGGED_OUT``, ``LOGGED_IN``, or ``REMOVED``. diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-get-active-user-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-get-active-user-description.rst new file mode 100644 index 0000000000..0ebb1539b4 --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-get-active-user-description.rst @@ -0,0 +1,2 @@ +You can get the current active user using :kotlin-sync-sdk:`App.currentUser +`. diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-list-all-users-on-device-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-list-all-users-on-device-description.rst new file mode 100644 index 0000000000..4d005cd7f8 --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-list-all-users-on-device-description.rst @@ -0,0 +1,9 @@ +You can access a map of all known user accounts that are stored on +the device using the +:kotlin-sync-sdk:`app.allUsers() ` +method. This method returns all users that have logged in to the +client app on a given device regardless of whether they are currently +authenticated (the ``user.state`` is ``LOGGED_IN`` or ``LOGGED_OUT``). + +In the following example, the SDK returns both Emma and Joe's +:kotlin-sync-sdk:`user.id `: diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-log-user-out-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-log-user-out-description.rst new file mode 100644 index 0000000000..e3581875af --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-log-user-out-description.rst @@ -0,0 +1,7 @@ +To log out a logged-in user, call the +:kotlin-sync-sdk:`user.logOut() ` +method. + +In the following example, Joe is currently logged-in as the current user. +After we log Joe out of the app, we confirm that he is still stored on +the device as a user and that Emma is now the current user: diff --git a/source/includes/api-details/kotlin/users/multi-user-applications-remove-user-from-device-description.rst b/source/includes/api-details/kotlin/users/multi-user-applications-remove-user-from-device-description.rst new file mode 100644 index 0000000000..cdd93a889b --- /dev/null +++ b/source/includes/api-details/kotlin/users/multi-user-applications-remove-user-from-device-description.rst @@ -0,0 +1,7 @@ +You can actively remove a user, and all information about that user, from +a device using +:kotlin-sync-sdk:`user.remove() `. + +In the following example, Emma is the current (and only) logged-in user +on the device. After we remove her, we confirm that Emma is removed from the +device and that there is no current user, as Joe is still logged out: diff --git a/source/includes/api-details/swift/users/multi-user-applications-add-user-to-device-description.rst b/source/includes/api-details/swift/users/multi-user-applications-add-user-to-device-description.rst new file mode 100644 index 0000000000..e352836d65 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-add-user-to-device-description.rst @@ -0,0 +1,3 @@ +In the example below, a user with the email ``joe@example.com`` logs in and +becomes the active user. Later, a user with the email ``emma@example.com`` +logs in and becomes the active user. diff --git a/source/includes/api-details/swift/users/multi-user-applications-change-active-user-description.rst b/source/includes/api-details/swift/users/multi-user-applications-change-active-user-description.rst new file mode 100644 index 0000000000..7c19a81538 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-change-active-user-description.rst @@ -0,0 +1 @@ +You can change the active user with the ``App.switch(to: User)`` method. \ No newline at end of file diff --git a/source/includes/api-details/swift/users/multi-user-applications-check-user-state-description.rst b/source/includes/api-details/swift/users/multi-user-applications-check-user-state-description.rst new file mode 100644 index 0000000000..65243be5a3 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-check-user-state-description.rst @@ -0,0 +1,3 @@ +To check the user state, read the ``user.state`` property. This property's +value is an :objc-sdk:`RLMUserState ` enum whose +cases reflect whether the user is logged out, logged in, or removed. diff --git a/source/includes/api-details/swift/users/multi-user-applications-get-active-user-description.rst b/source/includes/api-details/swift/users/multi-user-applications-get-active-user-description.rst new file mode 100644 index 0000000000..955034f1d8 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-get-active-user-description.rst @@ -0,0 +1,3 @@ +You can get the current active user through the +:objc-sdk:`App.currentUser +` property. diff --git a/source/includes/api-details/swift/users/multi-user-applications-list-all-users-on-device-description.rst b/source/includes/api-details/swift/users/multi-user-applications-list-all-users-on-device-description.rst new file mode 100644 index 0000000000..b22e2986d0 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-list-all-users-on-device-description.rst @@ -0,0 +1,8 @@ +You can access a map of all known user accounts that are stored on +the device through the ``app.allUsers`` property. This property returns all +users that have logged in to the client app on a given device regardless of +whether they are currently authenticated (the ``user.state`` is logged in or +logged out). + +In the following example, the SDK returns both Emma and Joe's +:objc-sdk:`user.identifier `: diff --git a/source/includes/api-details/swift/users/multi-user-applications-log-user-out-description.rst b/source/includes/api-details/swift/users/multi-user-applications-log-user-out-description.rst new file mode 100644 index 0000000000..15495375ed --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-log-user-out-description.rst @@ -0,0 +1,4 @@ +To log out a logged-in user, call the +:swift-sdk:`user.logOut() +` +method. diff --git a/source/includes/api-details/swift/users/multi-user-applications-remove-user-from-device-description.rst b/source/includes/api-details/swift/users/multi-user-applications-remove-user-from-device-description.rst new file mode 100644 index 0000000000..1abb9bc4a4 --- /dev/null +++ b/source/includes/api-details/swift/users/multi-user-applications-remove-user-from-device-description.rst @@ -0,0 +1,4 @@ +You can actively remove a user, and all information about that user, from +a device using +:swift-sdk:`user.remove() +`. diff --git a/source/includes/sdk-examples/users/multi-user-applications-add-new-user-to-device.rst b/source/includes/sdk-examples/users/multi-user-applications-add-new-user-to-device.rst new file mode 100644 index 0000000000..baaaa451ff --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-add-new-user-to-device.rst @@ -0,0 +1,58 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/generated/dotnet/MultiUserExamples.snippet.multi-add.cs + :language: csharp + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.email-password-credentials.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.add-a-new-user.java + :language: java + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.add-a-new-user.kt + :language: kotlin + + - id: javascript + content: | + + .. literalinclude:: /examples/MultiUser/AddUser/AddUser.js + :language: javascript + + - id: kotlin + content: | + + .. io-code-block:: + + .. input:: /examples/generated/kotlin/AuthenticationTest.snippet.add-a-new-user.kt + :language: kotlin + + .. output:: + :language: console + + Successfully logged in. User state: LOGGED_IN. Current user is now: 65133e130075a51f12a9e635 + Successfully logged in. User state: LOGGED_IN. Current user is now: 65133e1357aaf22529343c1b + + - id: swift + content: | + + .. literalinclude:: /examples/generated/code/start/MultipleUsers.snippet.add-user.swift + :language: swift + + - id: typescript + content: | + + .. literalinclude:: /examples/MultiUser/AddUser/AddUser.ts + :language: typescript diff --git a/source/includes/sdk-examples/users/multi-user-applications-change-active-user.rst b/source/includes/sdk-examples/users/multi-user-applications-change-active-user.rst new file mode 100644 index 0000000000..8792b9901b --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-change-active-user.rst @@ -0,0 +1,51 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/generated/dotnet/MultiUserExamples.snippet.multi-switch.cs + :language: csharp + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.change-active-user.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.java + :language: java + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.kt + :language: kotlin + + - id: javascript + content: | + + .. literalinclude:: /examples/MultiUser/SwitchUser/SwitchUser.js + :language: javascript + + - id: kotlin + content: | + + .. literalinclude:: /examples/MissingPlaceholders/api.kt + :language: kotlin + :copyable: false + + - id: swift + content: | + + .. literalinclude:: /examples/generated/code/start/MultipleUsers.snippet.switch-user.swift + :language: swift + + - id: typescript + content: | + + .. literalinclude:: /examples/MultiUser/SwitchUser/SwitchUser.ts + :language: typescript diff --git a/source/includes/sdk-examples/users/multi-user-applications-check-user-state.rst b/source/includes/sdk-examples/users/multi-user-applications-check-user-state.rst new file mode 100644 index 0000000000..5c42fac49b --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-check-user-state.rst @@ -0,0 +1,58 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.cs + :language: csharp + :copyable: false + + - id: dart + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.dart + :language: dart + :copyable: false + + - id: java + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.java + :language: java + :copyable: false + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example-java-kotlin.kt + :language: kotlin + :copyable: false + + - id: javascript + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.js + :language: javascript + :copyable: false + + - id: kotlin + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.kt + :language: kotlin + :copyable: false + + - id: swift + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.swift + :language: swift + :copyable: false + + - id: typescript + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.ts + :language: typescript + :copyable: false diff --git a/source/includes/sdk-examples/users/multi-user-applications-get-active-user.rst b/source/includes/sdk-examples/users/multi-user-applications-get-active-user.rst new file mode 100644 index 0000000000..3e66b6e858 --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-get-active-user.rst @@ -0,0 +1,53 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.cs + :language: csharp + :copyable: false + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.retrieve-current-user.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.java + :language: java + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.kt + :language: kotlin + + - id: javascript + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.js + :language: javascript + + - id: kotlin + content: | + + .. literalinclude:: /examples/generated/kotlin/AuthenticationTest.snippet.retrieve-current-user.kt + :language: kotlin + + - id: swift + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.swift + :language: swift + :copyable: false + + - id: typescript + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.ts + :language: typescript + :copyable: false diff --git a/source/includes/sdk-examples/users/multi-user-applications-list-all-users-on-device.rst b/source/includes/sdk-examples/users/multi-user-applications-list-all-users-on-device.rst new file mode 100644 index 0000000000..8b7581fdcc --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-list-all-users-on-device.rst @@ -0,0 +1,58 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/generated/dotnet/MultiUserExamples.snippet.multi-list.cs + :language: csharp + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.list-all-users.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.list-all-on-device-users.java + :language: java + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.list-all-on-device-users.kt + :language: kotlin + + - id: javascript + content: | + + .. literalinclude:: /examples/MultiUser/ListUsers/ListUsers.js + :language: javascript + + - id: kotlin + content: | + + .. io-code-block:: + + .. input:: /examples/generated/kotlin/AuthenticationTest.snippet.list-all-users.kt + :language: kotlin + + .. output:: + :language: console + + User on Device 651330cebe1d42b24b8d510f: 65133e1357aaf22529343c1b + User on Device 651330cebe1d42b24b8d510f: 65133e130075a51f12a9e635 + + - id: swift + content: | + + .. literalinclude:: /examples/generated/code/start/MultipleUsers.snippet.list-users.swift + :language: swift + + - id: typescript + content: | + + .. literalinclude:: /examples/MultiUser/ListUsers/ListUsers.ts + :language: typescript diff --git a/source/includes/sdk-examples/users/multi-user-applications-log-user-out.rst b/source/includes/sdk-examples/users/multi-user-applications-log-user-out.rst new file mode 100644 index 0000000000..2161abc729 --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-log-user-out.rst @@ -0,0 +1,58 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/generated/dotnet/QuickStartExamples.snippet.logout.cs + :language: csharp + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.log-out.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.java + :language: java + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.switch-the-active-user.kt + :language: kotlin + + - id: javascript + content: | + + .. literalinclude:: /examples/generated/node/authenticate.snippet.logout-current-user.js + :language: javascript + + - id: kotlin + content: | + + .. io-code-block:: + + .. input:: /examples/generated/kotlin/AuthenticationTest.snippet.log-out-a-user.kt + :language: kotlin + + .. output:: + :language: console + + Successfully logged out user. User state: LOGGED_OUT. Current user is now: 65133e1357aaf22529343c1b + + - id: swift + content: | + + .. literalinclude:: /examples/generated/code/start/Authenticate.snippet.logout.swift + :language: swift + + - id: typescript + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.ts + :language: typescript + :copyable: false diff --git a/source/includes/sdk-examples/users/multi-user-applications-remove-user-from-device.rst b/source/includes/sdk-examples/users/multi-user-applications-remove-user-from-device.rst new file mode 100644 index 0000000000..c4a63a5ecc --- /dev/null +++ b/source/includes/sdk-examples/users/multi-user-applications-remove-user-from-device.rst @@ -0,0 +1,62 @@ +.. tabs-drivers:: + + tabs: + - id: csharp + content: | + + .. literalinclude:: /examples/generated/dotnet/MultiUserExamples.snippet.multi-remove.cs + :language: csharp + + - id: dart + content: | + + .. literalinclude:: /examples/generated/flutter/authenticate_users_test.snippet.remove-user.dart + :language: dart + + - id: java + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.remove-a-user-from-device.java + :language: java + :emphasize-lines: 4 + + - id: java-kotlin + content: | + + .. literalinclude:: /examples/generated/java/sync/MultipleUsersTest.snippet.remove-a-user-from-device.kt + :language: kotlin + :emphasize-lines: 4 + + - id: javascript + content: | + + .. literalinclude:: /examples/MultiUser/LogoutUser/LogoutUser.js + :language: javascript + :emphasize-lines: 3 + + - id: kotlin + content: | + + .. io-code-block:: + + .. input:: /examples/generated/kotlin/AuthenticationTest.snippet.remove-a-user.kt + :language: kotlin + + .. output:: + :language: console + + Successfully removed user. User state: REMOVED. Current user is now: null + + - id: swift + content: | + + .. literalinclude:: /examples/MissingPlaceholders/example.swift + :language: swift + :copyable: false + + - id: typescript + content: | + + .. literalinclude:: /examples/MultiUser/LogoutUser/LogoutUser.ts + :language: typescript + :emphasize-lines: 3 diff --git a/source/sdk/users/multi-user-applications.txt b/source/sdk/users/multi-user-applications.txt index f31968abbe..2b4cdee6e6 100644 --- a/source/sdk/users/multi-user-applications.txt +++ b/source/sdk/users/multi-user-applications.txt @@ -4,10 +4,455 @@ Multi-User Applications ======================= +.. meta:: + :description: Build an app that supports multiple users, including the ability switch the active user, with Atlas Device SDK. + :keywords: Realm, Flutter SDK, Kotlin SDK, Java SDK, .NET SDK, Node.js SDK, Swift SDK, code example + +.. facet:: + :name: genre + :values: reference + +.. facet:: + :name: programming_language + :values: csharp, dart, java, javascript/typescript, kotlin, swift + .. contents:: On this page :local: :backlinks: none :depth: 2 :class: singlecol -Placeholder page for multi-user application content. +.. tabs-selector:: drivers + +Atlas Device SDK allows multiple :ref:`users ` to be logged in +to an app simultaneously on a given device. Client applications run +in the context of a single active user even if multiple users are logged in +simultaneously. You can quickly switch between authenticated users without +requiring them to log in again. + +.. important:: + + C++ does not currently support multi-user applications. + +.. important:: + + **Any logged-in user may become the active user without re-authenticating.** + Depending on your app, this may be a security vulnerability. For example, a + user on a shared device may switch to a coworker's logged in account without + providing their credentials or requiring their explicit permission. If your + application requires stricter authentication, avoid switching between users + and prefer to explicitly log the active user out before authenticating + another user. + +.. _sdks-multi-user-user-account-states: + +User Account States +------------------- + +When a user first logs in through Atlas App Services on a given device or +browser, the SDK saves the user's information and keeps track of the user's +state on the device. The user's data remains on the device, even if they log +out, unless you actively remove the user. + +The following states describe an on-device user at any given time: + +- **Authenticated:** any user that has logged in on the device + and has not logged out or had its session revoked. + + - **Active**: a single authenticated user that is currently using the + app on a given device. The SDK associates this user with outgoing + requests and Atlas evaluates data access permissions and runs Functions in + this user's context. See :ref:`active user ` for more + information. + + - **Inactive**: all authenticated users that are not the current + active user. You switch the active user to a currently inactive user at + any time. + +- **Logged Out:** any user that authenticated on the device but + has since logged out or had their session revoked. + +The following diagram shows how users within a client app +transition between states when certain events occur: + +.. figure:: /images/multi-user.png + :alt: A diagram the outlines the different states a user can be in: logged out, logged in and active, & logged in and inactive. + +.. _sdks-multi-user-account-check-user-state: + +Check User State +~~~~~~~~~~~~~~~~ + +The SDK provides a property you can check to determine the user's current state. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-check-user-state-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-check-user-state-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-check-user-state-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-check-user-state.rst + +.. _sdks-multi-user-add-new-user-to-device: + +Add a New User to the Device +---------------------------- + +The SDK automatically adds users to a device when they log in for the first +time on that device. When a user logs in, they immediately become the +application's active user. For details about authenticating a user, refer to +:ref:`sdks-authenticate-users`. + +.. TODO: Add an API description to the Dart tab in the consolidation gaps follow-up ticket when we update the code example + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-add-user-to-device-description.rst + + .. tab:: + :tabid: dart + + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-add-user-to-device-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-add-user-to-device-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-add-user-to-device-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-add-user-to-device-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-add-user-to-device-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-add-user-to-device-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-add-new-user-to-device.rst + +.. _sdks-multi-user-list-all-users-on-device: + +List All Users on the Device +---------------------------- + +You can access a list of all :ref:`user accounts ` that are +stored on the device. This list includes all users that have logged in to the +app on a given device regardless of whether they are currently authenticated. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-list-all-users-on-device-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-list-all-users-on-device-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-list-all-users-on-device-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-list-all-users-on-device.rst + +.. _sdks-multi-user-get-active-user: + +Get the Active User +------------------- + +You can get the current active user in your app. If multiple users are +logged in, this returns the last valid user that logged in to the device. This +method returns the language's implementation of ``nil`` or ``null`` if there +are no logged-in users. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-get-active-user-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-get-active-user-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-get-active-user-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-get-active-user.rst + +.. _sdks-multi-user-change-active-user: + +Change the Active User +---------------------- + +You can change an app's :ref:`active user ` to another +logged-in user at any time. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-change-active-user-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-change-active-user-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-change-active-user-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-change-active-user-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-change-active-user-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-change-active-user-not-supported.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-change-active-user-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-change-active-user-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-change-active-user.rst + +.. _sdks-multi-user-log-user-out: + +Log a User Out +-------------- + +You can log a logged-in user out of an app. Once logged out, the user is still +stored on the device but must log back in to use the app. If another logged-in +user exists on the device, logging a user out automatically sets the remaining +logged-in user as the active user. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-log-user-out-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-log-user-out-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-log-user-out-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-log-user-out.rst + +For more information, refer to :ref:`sdks-logout`. + +.. _sdks-multi-user-remove-user-from-device: + +Remove a User from the Device +----------------------------- + +You can remove all information about a user from the device and automatically +log the user out. Once removed, the user must re-authenticate to use the app +again. This *does not* delete the user from Atlas. If another logged-in +user exists on the device, removing a user out automatically sets the remaining +logged-in user as the active user. + +.. tabs-drivers:: + + .. tab:: + :tabid: csharp + + .. include:: /includes/api-details/csharp/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: dart + + .. include:: /includes/api-details/dart/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: java + + .. include:: /includes/api-details/java/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: java-kotlin + + .. include:: /includes/api-details/java/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: javascript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-remove-user-from-device-js-ts-description.rst + + .. tab:: + :tabid: kotlin + + .. include:: /includes/api-details/kotlin/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: swift + + .. include:: /includes/api-details/swift/users/multi-user-applications-remove-user-from-device-description.rst + + .. tab:: + :tabid: typescript + + .. include:: /includes/api-details/javascript/users/multi-user-applications-remove-user-from-device-js-ts-description.rst + +.. include:: /includes/sdk-examples/users/multi-user-applications-remove-user-from-device.rst + +For more information on removing and deleting users, refer to +:ref:`sdks-create-and-delete-users`.