Iniciar 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 proveen la lógica para gestionar los tokens y los integran en las solicitudes.
Usuario anónimo
The Anonymous provider allows users to log in to your application with temporary accounts that have no associated information.
Para iniciar sesión, crea una credencial anónima y pásala 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);
Email/Password User
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.
To log in, create an email/password credential with the user's email address and password and pass it to 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);
API Key User
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.
To log in with an API key, create an API Key credential with a server or user API key and pass it to 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 Custom JWT le permite gestionar la autenticación de usuarios con cualquier sistema de autenticación que devuelva un JSON web token.
Para iniciar sesión, crea una credencial JWT personalizada con un JWT del sistema externo y pásala 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
The Custom Function authentication provider allows you to handle user authentication by running a function that receives a payload of arbitrary information about a user.
Para iniciar sesión con el proveedor de función personalizada, cree una credencial de función personalizada con un objeto payload y páselo 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);
Facebook User
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
Do Not Store Facebook Profile Picture URLs
Facebook profile picture URLs include the user's access token to grant permission to the image. To ensure security, do not store a URL that includes a user's access token. Instead, access the URL directly from the user's metadata fields when you need to fetch the image.
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
Enable the Google Auth Provider
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.
To set up your App for Google User authentication in your App configuration:
In the Google Cloud Platform console, create an OAuth 2.0 client ID of type "Web application".
Configure your backend App to use that client ID and the associated client secret.
Enable OpenID Connect on the 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:
Install the Realm and Google APIs npm packages.
npm install realm@12 googleapis Import the packages into your project.
const Realm = require("realm"); const { google } = require("googleapis"); Create configuration for Google OAuth 2.0 client and 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, }); Genera un enlace de inicio de sesión OAuth y pásalo 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, }); Process the request from the the Google authentication server, which includes an access code in the query string using the Google OAuth 2.0 client's
getToken()method. In the callback function, sign in to your App using theid_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
Authenticate with Google on a Node.js Server
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.
Puedes necesitar autenticarte con Google en un servidor Node.js para realizar operaciones del lado del servidor en nombre de un usuario, como llamar a una Atlas Function con las credenciales del usuario.
Apple User
The Apple authentication provider allows you to authenticate users through Sign-in With Apple.
Nota
Habilita 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 JavaScript Sign in with Apple para gestionar la autenticación del usuario y el flujo de redirección desde una aplicación cliente. Una vez autenticado, el SDK de JavaScript de Apple devuelve un token de ID que puedes enviar a tu aplicación Node.js y usar para finalizar el inicio de sesión del usuario en tu aplicación.
// 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
If you get a Login failed error saying that the token contains
an invalid number of segments, verify that you're passing a UTF-8-encoded string version of the 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 realm sin conexión, consulta los Abrir un Realm sincronizado sin conexión docs.
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.
If you send requests outside of the SDK, you need to include the user's access token with each request and manually refresh the token when it expires.
Puedes acceder y actualizar el token de acceso de un usuario con la sesión iniciada en el SDK directamente desde su objeto Realm.User, como se muestra 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; }
Expiración del token de actualización
Refresh tokens expire after a set period of time. When the refresh token expires, the access token can no longer be refreshed and the user must log in again.
If the refresh token expires after the realm is open, the device will not be able to sync until the user logs in again. Your sync error handler should implement logic that catches a token expired error when attempting to sync, then redirect users to a login flow.
For information on configuring refresh token expiration, refer to Manage User Sessions in the App Services documentation.
Log a User Out
Para desconectar a cualquier usuario, llama al User.logOut() en su instancia de usuario.
Advertencia
Cuando un usuario cierra su sesión, ya no puedes leer ni escribir datos en los realms sincronizados que haya abierto ese usuario. Como resultado, cualquier operación que no se haya completado antes de que el usuario que la inició cierre su sesión no podrá completarse correctamente y es probable que genere un error. Cualquier dato en una operación de escritura que falle de esta manera se perderá.
// Log out the current user await app.currentUser?.logOut();