Inicia sesión
Realm proporciona una API para autenticar usuarios en una aplicación con cualquier proveedor de autenticación habilitado. Crear una instancia Credentials objeto y páselo al método app.login() para autenticar el inicio de sesión de un usuario y crear un objeto User.
Sesiones de usuario
Atlas App Services gestiona sesiones con tokens de acceso y tokens de actualización. Los SDK de cliente proporcionan la lógica para gestionar los tokens y proporcionarles solicitudes.
Usuario anónimo
El proveedor anónimo permite a los usuarios iniciar sesión en su aplicación con cuentas temporales que no tienen información asociada.
Para iniciar sesión, cree una credencial anónima y pásela a App.logIn():
// Create an anonymous credential const credentials = Realm.Credentials.anonymous(); const user = await app.logIn(credentials);
// Create an anonymous credential const credentials = Realm.Credentials.anonymous(); const user = await app.logIn(credentials);
Correo electrónico/Contraseña Usuario
El proveedor de autenticación de correo electrónico/contraseña permite a los usuarios iniciar sesión en su aplicación con una dirección de correo electrónico y una contraseña.
Para iniciar sesión, cree una credencial de correo electrónico/contraseña con la dirección de correo electrónico y la contraseña del usuario y pásela a App.logIn():
// Create an email/password credential const credentials = Realm.Credentials.emailPassword( "someone@example.com", "Pa55w0rd!" ); const user = await app.logIn(credentials);
// Create an email/password credential const credentials = Realm.Credentials.emailPassword( "someone@example.com", "Pa55w0rd!" ); const user = await app.logIn(credentials);
Usuario de clave API
El proveedor de autenticación de clave API permite que los procesos del servidor accedan a su aplicación directamente o en nombre de un usuario.
Para iniciar sesión con una clave API, cree una credencial de clave API con una clave API de servidor o usuario y pásela a App.logIn():
// Get the API key from the local environment const apiKey = process.env?.appServicesApiKey; if (!apiKey) { throw new Error("Could not find a Server API Key."); } // Create an api key credential const credentials = Realm.Credentials.apiKey(apiKey); const user = await app.logIn(credentials);
// Get the API key from the local environment. const apiKey = process.env?.appServicesApiKey; if (!apiKey) { throw new Error("Could not find a Server API Key."); } // Create an api key credential. const credentials = Realm.Credentials.apiKey(apiKey); const user = await app.logIn(credentials);
Usuario JWT personalizado
El proveedor de autenticación JWT personalizado le permite gestionar la autenticación de usuarios con cualquier sistema de autenticación que devuelva un token web JSON.
Para iniciar sesión, cree una credencial JWT personalizada con un JWT del sistema externo y páselo a App.logIn():
// Create a custom jwt credential const jwt = await authenticateWithExternalSystem(); const credentials = Realm.Credentials.jwt(jwt); const user = await app.logIn(credentials);
// Create a custom jwt credential. const jwt = await authenticateWithExternalSystem(); const credentials = Realm.Credentials.jwt(jwt); const user = await app.logIn(credentials);
Usuario de función personalizada
El proveedor de autenticación de funciones personalizadas le permite gestionar la autenticación de usuarios ejecutando una función que recibe una carga útil de información arbitraria sobre un usuario.
Para iniciar sesión con el proveedor de funciones personalizadas, cree una credencial de función personalizada con un objeto de carga útil y pásela a App.logIn():
// Create a custom function credential const credentials = Realm.Credentials.function({ username: "ilovemongodb", }); const user = await app.logIn(credentials);
// Create a custom function credential. const credentials = Realm.Credentials.function({ username: "ilovemongodb", }); const user = await app.logIn(credentials);
Usuario de Facebook
El proveedor de autenticación de Facebook le permite autenticar usuarios a través de una aplicación de Facebook utilizando su cuenta de Facebook existente.
Importante
Habilitar el proveedor de autenticación de Facebook
Para iniciar sesión un usuario con su cuenta de Facebook existente, debe configurar y habilitar el proveedor de autenticación de Facebook para su aplicación.
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.
Puedes utilizar el SDK oficial de Facebook Para gestionar la autenticación del usuario y redirigir el flujo desde una aplicación cliente. Una vez autenticado, el SDK de Facebook devuelve un token de acceso que puedes enviar a tu aplicación Node.js y usar para finalizar el inicio de sesión del usuario.
// Get the access token from the Facebook SDK const { accessToken } = FB.getAuthResponse(); // Define credentials with the access token from the Facebook SDK const credentials = Realm.Credentials.facebook(accessToken); // Log the user in to your app await app.logIn(credentials);
Usuario de Google
El proveedor de autenticación Google le permite autenticar usuarios mediante un proyecto de Google utilizando su cuenta de Google existente.
Nota
Habilitar el proveedor de autenticación de Google
Para autenticar a un usuario de Google, debes configurar el proveedor de autenticación de Google. Debes habilitar OpenID Connect para utilizar el Authentication Provider de Google con el Node.js SDK.
Para configurar su aplicación para la autenticación de usuario de Google en la configuración de su aplicación:
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 la librería de autenticación de Google para nodo.js oficial para gestionar el flujo de autenticación y redirección de usuarios desde una aplicación cliente de nodo.js:
Instale los paquetes npm de las API de Google y Realm.
npm install realm@12 googleapis Importa los paquetes a tu proyecto.
const Realm = require("realm"); const { google } = require("googleapis"); Cree una configuración para el cliente Google OAuth 2.0 y Realm.
// Configure and instantiate Google OAuth2.0 client const oauthConfig = { client_id: GOOGLE_CLIENT_ID, project_id: GOOGLE_PROJECT_ID, auth_uri: "https://accounts.google.com/o/oauth2/auth", token_uri: "https://oauth2.googleapis.com/token", auth_provider_x509_cert_url: "https://www.googleapis.com/oauth2/v1/certs", client_secret: GOOGLE_CLIENT_SECRET, redirect_uris: [`${BASE_URL}/auth/google/callback`], JWTsecret: "secret", scopes: [ "https://www.googleapis.com/auth/userinfo.email", "https://www.googleapis.com/auth/userinfo.profile", "openid", // any other scopes you might require. View all here - https://developers.google.com/identity/protocols/oauth2/scopes ], }; const OAuth2 = google.auth.OAuth2; const oauth2Client = new OAuth2( oauthConfig.client_id, oauthConfig.client_secret, oauthConfig.redirect_uris[0] ); // Instantiate Realm app const realmApp = new Realm.App({ id: REALM_APP_ID, }); Genere un enlace de inicio de sesión OAuth y páselo al cliente de la aplicación.
// generate OAuth 2.0 log in link const loginLink = oauth2Client.generateAuthUrl({ access_type: "offline", // Indicates that we need to be able to access data continuously without the user constantly giving us consent scope: oauthConfig.scopes, }); Procesa la solicitud del servidor de autenticación de Google, que incluye un código de acceso en la cadena de consulta, mediante el método
getToken()del cliente Google OAuth 2.0. En la función de devolución de llamada, inicia sesión en tu aplicación conid_token.// Get Google token and use it to sign into Realm oauth2Client.getToken(authCodeFromQueryString, async function ( error, token ) { if (error) return errorHandler(error); try { const credential = Realm.Credentials.google({ idToken: token.id_token, }); const user = await realmApp.logIn(credential); console.log("signed in as Realm user", user.id); } catch (error) { errorHandler(error); } });
Ejemplo
Autenticarse con Google en un servidor Node.js
Consulta el código de un servidor de ejemplo en nodo.js que implementa Acceder con Google. Todo el 2.0 OAuth de Google. La implementación está en el archivo server.js.
El ejemplo utiliza Express para el enrutamiento y la biblioteca de autenticación de Google para Node.js.
Es posible que desees autenticarte con Google en un servidor Node.js para realizar operaciones del lado del servidor en nombre de un usuario, como llamar a una función Atlas con las credenciales de un usuario.
Usuario de Apple
El proveedor de autenticación de Apple le permite autenticar usuarios a través de Iniciar sesión con Apple.
Nota
Habilitar el proveedor de autenticación de Apple
Para autenticar a un usuario de Apple, debe configurar el proveedor de autenticación Apple.
Puedes usar el SDK oficial de Iniciar sesión con Apple JS para gestionar la autenticación del usuario y redirigir el flujo desde una aplicación cliente. Una vez autenticado, el SDK de Apple JS devuelve un token de ID que puedes enviar a tu app Node.js y usar para finalizar el inicio de sesión del usuario.
// Get the ID token from the Apple SDK const { id_token } = await AppleID.auth.signIn(); // Define credentials with the ID token from the Apple SDK const credentials = Realm.Credentials.apple(id_token); // Log the user in to your app const user = await app.logIn(credentials);
Tip
Si recibe un error Login failed que indica que token contains
an invalid number of segments, verifique que esté pasando una versión de cadena codificada en UTF-8del JWT.
Inicio de 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.
// Log user into your App Services App. // On first login, the user must have a network connection. const getUser = async () => { // If the device has no cached user credentials, log in. if (!app.currentUser) { const credentials = Realm.Credentials.anonymous(); await app.logIn(credentials); } // If the app is offline, but credentials are // cached, return existing user. return app.currentUser!; };
Para aprender a usar el usuario en caché en la configuración de sincronización y acceder a un reino sin conexión, lea la documentación Abrir un reino sincronizado sin conexión.
Obtener un token de acceso de usuario
Cuando un usuario inicia sesión, Atlas App Services crea un token de acceso que le otorga acceso a su aplicación. El SDK 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 con cada solicitud. Realm no actualiza automáticamente el token de actualización. Cuando este caduque, el usuario deberá volver a iniciar sesión.
Si envía solicitudes fuera del SDK, debe incluir el token de acceso del usuario con cada solicitud y actualizar manualmente el token cuando caduque.
Puede acceder y actualizar el token de acceso de un usuario que haya iniciado sesión en el SDK desde su objeto Realm.User, como en el siguiente ejemplo:
// Gets a valid user access token to authenticate requests async function getValidAccessToken(user) { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it if necessary. await user.refreshCustomData(); return user.accessToken; }
// Gets a valid user access token to authenticate requests async function getValidAccessToken(user: Realm.User) { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it if necessary. await user.refreshCustomData(); return user.accessToken; }
Vencimiento 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
Para desconectar a cualquier usuario, llama al User.logOut() en su instancia de 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.
// Log out the current user await app.currentUser?.logOut();