Para acceder a Atlas App Services, primero debe autenticar a un usuario con un proveedor de autenticación de App Services. Esta página describe cómo autenticar a los usuarios de App Services con el SDK de Kotlin de Realm. Consulte Autenticar y administrar usuarios en la documentación de App Services para obtener más información.
Importante
Requisitos de eliminación de cuentas de Google y Apple
Google Apple exige que las aplicaciones publicadas en sus respectivas App Stores ofrezcan a cualquier usuario que cree una cuenta la opción de eliminarla. Tanto si utiliza un método de autenticación que requiere el registro manual de un usuario, como la autenticación por correo electrónico y contraseña, como uno que crea un usuario automáticamente, como Iniciar sesión con Apple, debe implementar la eliminación de cuentas de usuario.
Usuarios de servicios de aplicaciones
Atlas App Services proporciona los siguientes proveedores de autenticación integrados para iniciar y cerrar sesión de los usuarios en una aplicación cliente:
Usuarios anónimos
Combinaciones de correo electrónico y contraseña
Claves API
OAuth 2.0 a través de Facebook, Google y Apple ID
JWT personalizado
Función personalizada
Tras iniciar sesión correctamente, App Services inicia una sesión para el usuario. App Services gestiona las sesiones con tokens de acceso y tokens de actualización, y el SDK de Kotlin proporciona la lógica para gestionar los tokens y proporcionarles solicitudes. Para obtener más información sobre la gestión de sesiones y tokens de usuario, consulte "Sesiones de usuario" en la documentación de App Services.
Una vez que tenga un usuario registrado, podrá:
Abrir un reino sincronizado con el objeto de configuración del usuario
Ejecutar una función de backend como el usuario que inició sesión
Cerrar la sesión del usuario (consulte la sección Cerrar sesión de un usuario)
También puedes iniciar sesión simultáneamente con varios usuarios en una aplicación desde un mismo dispositivo. Consulta "Administrar aplicaciones multiusuario - SDK de Kotlin" para obtener más información.
Requisitos previos
Para autenticar usuarios a través de Atlas App Services, debe tener una aplicación de App Services con uno o más proveedores de autenticación habilitados.
Para configurar una aplicación de App Services con proveedores de autenticación, complete lo siguiente:
Habilitar y configurar proveedores de autenticación en la documentación de App Services
Tip
Puedes habilitar varios proveedores de autenticación. Si un usuario se autentica utilizando más de un método, puede vincular las identidades del usuario para cada método a una única cuenta de usuario.
Regístrese y cree una nueva cuenta de usuario
Atlas App Services registra a un usuario de forma diferente según el proveedor de autenticación:
Si utiliza la autenticación por correo electrónico y contraseña, los usuarios primero deben registrarse y confirmar su correo electrónico y contraseña antes de poder autenticarse.
Si usa Google, Facebook, Apple o JWT personalizado, el registro lo gestionan estos servicios de terceros.
Si usa autenticación anónima,no necesita registrarse. Los usuarios anónimos no necesitan registrarse.
La primera vez que el usuario se autentica correctamente en su aplicación, Atlas App Services crea automáticamente un objeto Usuario, que contiene un identificador único y metadatos de usuario específicos del proveedor. Para obtener más información sobre el objeto Usuario que App Services proporciona al SDK de Kotlin, consulte "Leer metadatos de usuario" en la documentación de App Services.
Iniciar sesión como usuario
Para autenticar e iniciar sesión en la aplicación, primero instancia un objeto Credentials que contenga las credenciales asociadas al proveedor de autenticación y luego pásalo a app.login(). Cada proveedor de autenticación corresponde a un método auxiliar estático que se utiliza para instanciarlo. Credentials objetos para ese proveedor de autenticación.
// 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 ... }
Si tiene éxito, app.login() devuelve un objeto User. En caso de error, app.login() genera una excepción de tipo AppException.
Tip
Puedes obtener el tipo de proveedor de autenticación que se utilizó para iniciar sesión de un usuario a través de la propiedad user.provider. Si el usuario ha cerrado sesión actualmente, se devuelve el proveedor más reciente utilizado para iniciar sesión.
Anónimo
La autenticación anónima permite a los usuarios iniciar sesión en tu aplicación con cuentas temporales que no almacenan información personal persistente. Puedes usarla para que los usuarios prueben tu aplicación antes de crear una cuenta o durante el desarrollo y las pruebas. Los usuarios anónimos no necesitan registrarse. Consulta "Autenticación anónima" en la documentación de App Services para obtener más información.
Para iniciar sesión con autenticación anónima, crea una credencial anónima llamando a Credentials.anonymous(), y luego pasa la credencial generada a 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) }
De forma predeterminada, el SDK de Kotlin reutiliza el mismo usuario anónimo si no ha cerrado sesión. Si desea crear más de un usuario anónimo, configure reuseExisting = false al iniciar sesión con credenciales anónimas adicionales:
// 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))
Correo electrónico/Contraseña
El proveedor de autenticación de correo electrónico y contraseña permite a los usuarios iniciar sesión en su aplicación con un nombre de usuario y una contraseña.Consulte "Autenticación de correo electrónico y contraseña" en la documentación de App Services para obtener más información.
Importante
Los usuarios con correo electrónico y contraseña requieren registro
La autenticación por correo electrónico y contraseña requiere que te registres y confirmes el correo electrónico y la contraseña proporcionados por el usuario antes de que este pueda autenticarse en una aplicación de App Services. Aprende a registrar usuarios con correo electrónico y contraseña.
Para iniciar sesión con autenticación de correo electrónico/contraseña, cree una credencial de correo electrónico/contraseña llamando a Credentials.emailPassword() con el correo electrónico y la contraseña registrados del usuario, y luego pase la credencial generada a 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 personalizado
El proveedor de autenticación JWT personalizada permite a los usuarios iniciar sesión en su aplicación con un token web JSON (JWT) personalizado. El proveedor gestiona el registro para la autenticación JWT. Consulte "Autenticación JWT personalizada" en la documentación de App Services para obtener más información.
Para iniciar sesión con autenticación JWT, cree una credencial JWT llamando a Credentials.jwt() con el JWT del usuario y luego pase la credencial generada a 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) }
Llave API
El proveedor de autenticación de clave API permite que usuarios no anónimos autenticados inicien sesión en su aplicación con una clave API. Consulte "Autenticación de clave API" en la documentación de App Services para obtener más información.
Para iniciar sesión con autenticación de clave API, cree una credencial de clave API llamando a Credentials.apiKey() con la clave API del usuario y luego pasando la credencial generada a app.login():
val app: App = App.create(YOUR_APP_ID) // Replace this with your App ID runBlocking { val user = app.login(Credentials.apiKey(key)) }
Las claves API de usuario se generan automáticamente y las gestiona el SDK de Kotlin. Aprenda a gestionar las claves API de usuario - SDK de Kotlin.
Función personalizada
El proveedor de autenticación de funciones personalizadas permite a los usuarios iniciar sesión en su aplicación mediante una lógica de autenticación personalizada gestionada por una función de Atlas.Consulte "Autenticación de funciones personalizadas" en la documentación de App Services para obtener más información.
Para iniciar sesión con la autenticación de función personalizada, pase sus argumentos personalizados como una carga útil a Credentials.customFunction() y luego pase la credencial generada a app.login():
// Create custom arguments for your Atlas Function val customCredentials = Credentials.customFunction( payload = mapOf("username" to "bob") ) val user = app.login(customCredentials)
Aprenda a llamar a una función Atlas - SDK de Kotlin.
Nuevo en la versión 1.9.0.
Puede serializar datos para una credencial de función personalizada mediante un codificador EJSON. Para obtener más información, incluidos ejemplos, consulte Codificación EJSON para Atlas.
El proveedor de autenticación de Google permite autenticar a los usuarios a través de su cuenta de Google existente mediante un 2.0 token OAuth.Consulta "Autenticación de Google" en la documentación de App Services para obtener más información.
Antes de poder autenticar usuarios con Google, debe configurar su aplicación para la autenticación de usuarios de Google:
En la consola de Google Cloud Platform, cree 2 un0 ID de cliente OAuth. del tipo "Aplicación web".
Configure su aplicación backend para usar ese ID de cliente y el secreto de cliente asociado.
Habilitar OpenID Connect en el backend.
Usa el inicio de sesión oficial de Google para Android para autenticar a los usuarios de Google en tu aplicación Android. El siguiente código implementa este flujo, comenzando con una llamada al loginWithGoogle() método:
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
Para obtener más información sobre el inicio de sesión de Google para Android, consulta la Guía de integración oficial del inicio de sesión de Google para Android.
Kotlin Multiplatform (KMP) es compatible con muchos entornos, pero este ejemplo muestra el inicio de sesión en Android. Para obtener información sobre cómo iniciar sesión en una cuenta de Google en plataformas Apple, consulte el ejemplo del SDK de Swift.
El proveedor de autenticación de Facebook permite autenticar a los usuarios a través de una aplicación de Facebook usando su cuenta de Facebook.Consulta "Autenticación de Facebook" en la documentación de Servicios de la aplicación para obtener más información.
Antes de poder autenticar usuarios con Facebook, debes configurar el flujo de autenticación para tu aplicación siguiendo la Guía de inicio rápido oficial de inicio de sesión de Facebook para Android.
En el controlador de finalización de inicio de sesión, obtenga el token de acceso del usuario conectado de Facebook LoginResult. Use el token de acceso para crear una credencial de Facebook llamando a Credentials.facebook() con el token de acceso del usuario y, a continuación, pase la credencial generada a 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}") } })
Importante
No almacene las URL de las imágenes de perfil de Facebook
Las URL de las fotos de perfil de Facebook incluyen el token de acceso del usuario para otorgar permiso a la imagen. Para garantizar la seguridad, no guardes una URL que incluya el token de acceso del usuario. En su lugar, accede a la URL directamente desde los campos de metadatos del usuario cuando necesites obtener la imagen.
Kotlin Multiplatform (KMP) es compatible con muchos entornos, pero este ejemplo muestra el inicio de sesión en Android. Para obtener información sobre cómo iniciar sesión en una cuenta de Facebook en plataformas Apple, consulte el ejemplo del SDK de Swift.
Manzana
El proveedor de autenticación "Iniciar sesión con Apple" permite a los usuarios iniciar sesión en su aplicación con un token personalizado proporcionado por Apple.Consulte "Autenticación de Apple ID" en la documentación de App Services para obtener más información.
Para iniciar sesión con la autenticación de Apple, cree una credencial de Apple llamando a Credentials.apple() con el token del usuario y luego pase la credencial generada a 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 Multiplatform (KMP) es compatible con muchos entornos, pero este ejemplo muestra el inicio de sesión en Android. Para obtener información sobre cómo iniciar sesión con Apple en plataformas Apple, consulte el ejemplo del SDK de Swift.
Recuperar usuario actual
Puede recuperar el usuario actualmente conectado con la propiedad App.currentUser:
val user = app.currentUser
Si varios usuarios han iniciado sesión en su aplicación, se devuelve el último usuario válido que inició sesión o null si no hay ningún usuario conectado. Consulte "Administrar aplicaciones multiusuario - SDK de Kotlin" para obtener más información.
Tenga en cuenta que el objeto currentUser se conserva en el almacenamiento local, por lo que incluso si la aplicación se cierra después de la autenticación inicial, no necesita llamar a logIn nuevamente (a menos que el usuario haya cerrado la sesión o la sesión del usuario haya expirado).
Utilice este método para iniciar sesión sin conexión o llamar a una función Atlas cuando se abra una aplicación posteriormente.
Iniciar sesión sin conexión
Cuando tu aplicación Realm autentica a un usuario, almacena en caché las credenciales del usuario. Puedes comprobar si existen credenciales de usuario para omitir el flujo de inicio de sesión y acceder al usuario almacenado en caché. Usa esto para abrir un realm sin conexión.
Nota
El inicio de sesión inicial requiere una conexión de red
Cuando un usuario se registra en tu aplicación o inicia sesión por primera vez con una cuenta existente en un cliente, este debe tener conexión de red. Comprobar las credenciales de usuario en caché permite abrir un reino sin conexión, pero solo si el usuario ha iniciado sesión previamente con conexión.
// 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()
Administrar tokens de usuario
El SDK de Kotlin de Realm administra automáticamente los tokens de acceso, los actualiza cuando caducan e incluye un token de acceso válido para el usuario actual en cada solicitud. Los tokens se eliminan después de que el usuario cierre sesión.
Importante
Realm solo actualiza el token de acceso del usuario.No lo actualiza automáticamente. Cuando el token de actualización caduca, el SDK ya no puede obtener un token de acceso actualizado y el dispositivo no puede sincronizarse hasta que el usuario vuelva a iniciar sesión.
Para obtener más información sobre el acceso a la sesión de usuario y los tokens de actualización, consulte Sesiones de usuario en la documentación de App Services.
Obtener un token de acceso de usuario
Puede obtener el token de acceso actual de un usuario que haya iniciado sesión con la propiedad user.accessToken:
val token = user.accessToken
Si envía solicitudes fuera del SDK, debe incluir el token de acceso del usuario en cada solicitud y actualizarlo manualmente cuando caduque. Los tokens de acceso caducan 30 minutos después de que el usuario inicie sesión.
Puede obtener el token de actualización actual de un usuario que haya iniciado sesión con la propiedad user.refreshToken, que puede usar para solicitar un nuevo token de acceso:
// Gets the current refresh token for the user fun getRefreshToken(): String { return user.refreshToken }
Configurar la expiración del token de actualización
Los tokens de actualización caducan tras un periodo determinado. Cuando caducan, el token de acceso ya no se puede actualizar y el usuario debe volver a iniciar sesión.
Si el token de actualización caduca después de abrir el dominio, el dispositivo no podrá sincronizarse hasta que el usuario vuelva a iniciar sesión. El controlador de errores de sincronización debe implementar una lógica que detecte un error de token caducado al intentar sincronizar y luego redirija a los usuarios a un flujo de inicio de sesión.
Para obtener información sobre cómo configurar la expiración del token de actualización, consulte Administrar sesiones de usuario en la documentación de App Services.
Cerrar la sesión de un usuario
Advertencia
Cuando un usuario cierra sesión, ya no se pueden leer ni escribir datos en los dominios sincronizados que haya abierto. Por lo tanto, cualquier operación que no se haya completado antes de que el usuario cierre sesión no podrá completarse correctamente y probablemente generará un error. Los datos de una operación de escritura que falle de esta manera se perderán.
Puede cerrar la sesión de cualquier usuario, independientemente del proveedor de autenticación utilizado para iniciar sesión, utilizando 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() }
El método user.logOut():
Elimina las credenciales de usuario almacenadas localmente del dispositivo.
Detiene inmediatamente cualquier sincronización hacia y desde los reinos del usuario.
Para usuarios anónimos, elimina al usuario.
Debido a que al cerrar la sesión se detiene la sincronización, solo debes cerrar la sesión después de que todas las actualizaciones locales de Realm se hayan cargado en el servidor.
Observar los cambios de autenticación
Nuevo en la versión 10.8.0.
Puede observar un flujo de eventos de cambio de autenticación llamando a App.authenticationChangeAsFlow(). Este flujo emite eventos AuthenticationChange de tres estados posibles, representados como subclases:
LoggedIn:Un usuario inicia sesión en la aplicación.LoggedOut:Un usuario cierra la sesión de la aplicación.Removed:Se elimina a un usuario de la aplicación, lo que también cierra su sesión.
Estos eventos contienen una propiedad user que proporciona una referencia al objeto User que inició sesión, cerró sesión o fue eliminado.
// 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) } }