@realm/react Tiene ganchos para la autenticación de usuarios. useAuth y useEmailPasswordAuth manejan la autenticación con proveedores de autenticación habilitados.
Para una useAuth referencia rápida, consulta el enlace useAuth en esta página. Para una referencia useEmailPasswordAuth rápida, consulta el enlace useEmailPasswordAuth en la página "Administrar usuarios de correo electrónico/contraseña".
También puedes usar directamente las APIs de Realm.js. Instancia un objeto Credenciales y pásalo a App.logIn() para autenticarte y obtener un objeto Usuario.
Requisitos previos
Antes de poder autenticar a un usuario, debe:
Habilite uno o más proveedores de autenticación en la aplicación.
Configurar la autenticación de usuario en el cliente
@realm/react Tiene proveedores y enlaces para la autenticación de usuarios. Para configurar la autenticación de usuarios:
Configurar
@realm/reactproveedores.Escriba un componente de respaldo para
UserProvider.
Configurar proveedores de @realm/react
Los componentes encapsulados por AppProvider pueden acceder a los ganchos useApp y useAuth. Estos componentes solo se renderizan si AppProvider se conecta correctamente al backend de App Services.
Los componentes encapsulados por UserProvider pueden acceder a usuarios autenticados con el gancho useUser. Estos componentes solo se renderizan si la aplicación tiene un usuario autenticado.
Para configurar la autenticación de usuario:
Envuelva todos los componentes que necesitan acceder a App Services en
AppProvider.Dentro de
AppProvider, envuelva todos los componentes a los que desea que tenga acceso un usuario autenticado conUserProvider.En
UserProvider, incluya una propiedadfallbackcon un componente que inicie sesión a un usuario. La aplicación representa este componente si no hay ningún usuario autenticado.
import React from 'react'; import {AppProvider, UserProvider} from '@realm/react'; // Fallback log in component that's defined in another file. import {LogIn} from './Login'; export const LoginExample = () => { return ( <ScrollView> <AppProvider id={APP_ID}> {/* If there is no authenticated user, mount the `fallback` component. When user successfully authenticates, the app unmounts the `fallback` component (in this case, the `LogIn` component). */} <UserProvider fallback={LogIn}> {/* Components inside UserProvider have access to the user. These components only mount if there's an authenticated user. */} <UserInformation /> </UserProvider> </AppProvider> </ScrollView> ); };
Escriba un componente de respaldo para UserProvider
Si tu aplicación no tiene un usuario autenticado ni conectado, UserProvider y sus elementos secundarios no se renderizarán. Para solucionar este caso, puedes pasar un componente de respaldo a UserProvider. Esta suele ser la pantalla de inicio de sesión de las aplicaciones.
El siguiente ejemplo utiliza autenticación anónima, pero puede utilizar cualquiera de los métodos useAuth.
Para escribir un componente de respaldo de autenticación para UserProvider:
Crear un componente funcional.
Desestructurar
logInWithAnonymousyresultdel ganchouseAuth.Llamar a
logInWithAnonymous()dentro de un bloqueuseEffectque tiene una matriz de dependencia vacía.Manejar
result. Si la autenticación no se realiza correctamente, puede escribir un manejo de errores basado enresult.
export const LogIn = () => { // `logInWithAnonymous` logs in a user using an // anonymous Realm Credential. // `result` gives us access to the result of the // current operation. In this case, `logInWithAnonymous`. const {logInWithAnonymous, result} = useAuth(); // Log in an anyonmous user on component render. // On successful login, this fallback component unmounts. useEffect(() => { logInWithAnonymous(); }, []) return ( <View > {!result.error && <Text>Please log in</Text>} <View> {result.pending && <ActivityIndicator />} {result.error && <ErrorComponent error={result.error} />} </View> </View> ); };
Sesiones de usuario
El SDK de React Native se comunica con Atlas App Services para gestionar sesiones con tokens de acceso y tokens de actualización.
Para obtener más información sobre la gestión de sesiones, consulte Sesiones de usuario en la documentación de App Services.
Proveedores de autenticación y autenticación de clientes
Después de configurar la autenticación de usuario en su cliente y los proveedores de autenticación en su aplicación App Services, puede iniciar sesión con los usuarios.
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.
Al llamar a un método de autenticación cuando un usuario está conectado actualmente, cambia el usuario actual al nuevo usuario.
Si llama a logInWithAnonymous() en la reserva de UserProvider, los hijos de UserProvider se procesan tan pronto como el inicio de sesión anónimo se realiza correctamente.
Para iniciar sesión como usuario anónimo:
Desestructurar
logInWithAnonymousyresultdel ganchouseAuth.Llama a
logInWithAnonymous()sin ningún argumento.Manejar el
result.
export const LogInWithAnonymous = () => { const {logInWithAnonymous, result} = useAuth(); const performAnonymousLogin = logInWithAnonymous; // Handle `result`... };
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.
Puedes usar el useEmailPasswordAuth enlace para gestionar el inicio de sesión de los usuarios en tu cliente. Para una useEmailPasswordAuth referencia rápida a, consulta el enlace useEmailPasswordAuth en la página "Administrar usuarios de correo electrónico/contraseña".
Para iniciar sesión como usuario con correo electrónico y contraseña:
Desestructurar
logInyresultdel ganchouseEmailPasswordAuth.Pase el correo electrónico y la contraseña del usuario a
LogIn()como un objeto.Manejar el
result.
export const LoginWithEmail = () => { const {logIn, result} = useEmailPasswordAuth(); const [email, setEmail] = useState(''); const [password, setPassword] = useState(''); const performLogin = () => { logIn({email, password}); }; // Handle `result`... };
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.
Antes de poder iniciar sesión como usuario con una clave API, debe crear una clave API.
Para iniciar sesión con una clave API:
Desestructurar
loginWithApiKeyyresultdel ganchouseAuth.Pase su clave API a
loginWithApiKey().
const loginApiKeyUser = async (apiKey: ApiKey) => { try { logInWithApiKey(apiKey!.key); } catch (error) { console.log(error); } };
Usuario JWT personalizado
El proveedor de autenticación JWT personalizado maneja la autenticación del usuario con cualquier sistema de autenticación que devuelva un token web JSON.
Para iniciar sesión con un usuario JWT personalizado:
Configure el proveedor de autenticación JWT en su backend de App Services.
Obtenga un JWT de un sistema externo.
Desestructurar
logInWithJWTyresultdel ganchouseAuth.Pase el JWT a
logInWithJWT().Manejar el
result.
export const LogInWithJWT = () => { const {logInWithJWT, result} = useAuth(); // Get the current anonymous user so we can call // an App Services Function later. const anonymousUser = useUser(); const performJWTLogin = async () => { // Get a JWT from a provider. In this case, from // an App Services Function called "generateJWT". const token = (await anonymousUser.functions.generateJWT()) as string; logInWithJWT(token); }; // Handle `result`... };
Usuario de función personalizada
El proveedor de autenticación de funciones personalizadas permite gestionar la autenticación de usuarios mediante la ejecución de una función que recibe una carga útil con información arbitraria sobre el usuario.Consulte Autenticación de funciones personalizadas para obtener más información.
Para iniciar sesión como usuario con el proveedor de funciones personalizadas:
Cree una función de App Services para gestionar sus necesidades de autenticación.
Habilite el proveedor de funciones personalizadas para su aplicación de servicios de aplicaciones y configúrelo para usar la función que creó anteriormente.
Desestructurar
logInWithFunctionyresultdel ganchouseAuth.Pase cualquier dato de usuario relevante (como un nombre de usuario) a
logInWithFunction().Manejar el
result.
export const LogInWithFunction = () => { const {logInWithFunction, result} = useAuth(); const performFunctionLogin = async (email: string, password: string) => { // Pass arbitrary information to the Atlas function configured // for your App's Custom Function provider. logInWithFunction({email, password}); }; // Handle `result`... };
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.
Para iniciar sesión un usuario con una cuenta de Facebook existente, debe configurar y habilitar el proveedor de autenticación de Facebook para su aplicación de Servicios de aplicaciones.
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 React Native y usar para finalizar el inicio de sesión del usuario.
export const LogInWithFacebook = () => { const {logInWithFacebook, result} = useAuth(); const performLogin = () => { // Get an access token using the Facebook SDK. // You must define this function. const token = getFacebookToken(); logInWithFacebook(token); }; // Handle `result`... };
Usuario de Google
El proveedor de autenticación de Google le permite autenticar a los usuarios con su cuenta de Google existente.
Para autenticar a un usuario de Google, debes configurar el proveedor de autenticación de Google para tu aplicación de Servicios de aplicaciones.
No existe una integración oficial de Iniciar sesión con Google para React Native. La forma más sencilla de integrar Iniciar sesión con Google en tu aplicación React Native con autenticación Realm es usar una biblioteca de terceros. También puedes crear tu propia solución con los Servicios de Identidad de Google para gestionar la autenticación de usuarios y redirigir el flujo desde una aplicación cliente.
Independientemente de la implementación, debes recuperar un token de ID del servidor de autorización de Google. Úsalo para iniciar sesión en Realm.
export const LogInWithGoogle = () => { const {logInWithGoogle, result} = useAuth(); const performLogin = () => { // Get an access token using a third-party library // or build your own solution. You must define this function. const token = getGoogleToken(); logInWithGoogle(token); }; // Handle `result`... };
Usuario de Apple
El proveedor de autenticación de Apple le permite autenticar usuarios a través de Iniciar sesión con Apple.
Para autenticar a un usuario de Apple, debes configurar el proveedor de autenticación de Apple para tu aplicación App Services.
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 React Native y usar para finalizar el inicio de sesión del usuario.
export const LogInWithApple = () => { const {logInWithApple, result} = useAuth(); const performLogin = () => { // Get an access token using the Apple SDK. // You must define this function. const token = getAppleToken(); logInWithApple(token); }; // Handle `result`... };
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:
const RefreshUserAcessToken = () => { const user = useUser(); const [accessToken, setAccessToken] = useState<string | null>(); // Gets a valid user access token to authenticate requests const refreshAccessToken = async () => { // 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(); setAccessToken(user.accessToken); }; // Use access token... };
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 cerrar la sesión de cualquier usuario, llama al método 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.
function UserInformation() { const user = useUser(); const {logOut} = useAuth(); const performLogout = () => { logOut(); }; // Add UI for logging out... }
Referencia del gancho useAuth
El useAuth gancho tiene un método de autenticación para cada proveedor de autenticación de App Services. También tiene un estado relacionado con la autenticación. Consulta la referencia de useAuth para obtener más información.
También puedes consultar la documentación de la @realm/react API para useAuth.