Inicia sesión
Usuario anónimo
Si lo has habilitado Autenticación anónima en la interfaz de usuario de App Services: los usuarios pueden iniciar sesión inmediatamente en la aplicación sin proporcionar información de identificación. El siguiente código muestra cómo hacerlo:
let anonymousCredentials = Credentials.anonymous app.login(credentials: anonymousCredentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
Correo electrónico/Contraseña Usuario
Si ha habilitado la autenticación de correo electrónico/contraseña, puede iniciar sesión utilizando el siguiente código:
let email = "skroob@example.com" let password = "12345" app.login(credentials: Credentials.emailPassword(email: email, password: password)) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
Usuario de clave API
Si ha habilitado la autenticación de clave API, puede iniciar sesión utilizando el siguiente código:
let credentials = Credentials.userAPIKey("<api-key>") app.login(credentials: credentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
Usuario de función personalizada
Si ha habilitado el proveedor de autenticación de función personalizada, puede iniciar sesión utilizando el siguiente código:
let params: Document = ["username": "bob"] app.login(credentials: Credentials.function(payload: params)) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
Usuario JWT personalizado
Si ha habilitado el proveedor de autenticación JWT personalizado, puede iniciar sesión con el siguiente código:
let credentials = Credentials.jwt(token: "<jwt>") app.login(credentials: credentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
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.
Siga la guía oficial de inicio de sesión rápido de Facebook para iOSPara configurar el flujo de autenticación de su aplicación, en el controlador de inicio de sesión, cree una credencial de Facebook de App Services con la cadena de token de acceso del usuario que inició sesión e inicie sesión en su aplicación de App Services.
// This example demonstrates login logic for FBSDK version 13.x. If you're using // a different version of FBSDK, you'll need to adapt this example for your version. let loginManager = LoginManager() loginManager.logIn(permissions: [ .email ]) { loginResult in switch loginResult { case .success(let grantedPermissions, let declinedPermissions, let accessToken): let credentials = Credentials.facebook(accessToken: accessToken!.tokenString) app.login(credentials: credentials) { result in DispatchQueue.main.async { switch result { case .failure(let error): print("Failed to log in to MongoDB Realm: \(error)") case .success(let user): print("Successfully logged in to MongoDB Realm using Facebook OAuth.") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } } } case .failed(let error): print("Facebook login failed: \(error)") case .cancelled: print("The user cancelled the login flow.") } }
Usuario de Google
Importante
Para iniciar sesión un usuario con su cuenta de Google existente, debe configurar y habilitar el proveedor de autenticación de Google para su aplicación.
Sigue la Guía oficial de integración de Google Sign-In para iOS para configurar el flujo de autenticación de tu aplicación. En el controlador de finalización de inicio de sesión, crea una credencial de Google de App Services e inicia la sesión del usuario en tu aplicación de App Services.
El valor que pase a la credencial dependerá de si ha habilitado o no OpenID Connect para el proveedor:
Si OpenID Connect está habilitado, pase el
id_tokenincluido en la respuesta de Google OAuth a Credentials.googleId(token:).Si OpenID Connect no está habilitado, pase el código de autorización del servidor del usuario a Credentials.google(serverAuthCode:).
func sign(_ signIn: GIDSignIn!, didSignInFor googleUser: GIDGoogleUser!, withError error: Error!) { if let error = error { print("\(error.localizedDescription)") return } // Get the ID token for the authenticated user so you can pass it to Realm let idToken = googleUser.authentication.idToken! let credentials = Credentials.googleId(token: idToken) app.login(credentials: credentials) { result in DispatchQueue.main.async { switch result { case .failure(let error): print("Failed to log in to MongoDB Realm: \(error)") case .success(let user): print("Successfully logged in to MongoDB Realm using Google OAuth.") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } } } }
func sign(_ signIn: GIDSignIn!, didSignInFor googleUser: GIDGoogleUser!, withError error: Error!) { if let error = error { print("\(error.localizedDescription)") return } // Upon first successful sign-in, forward serverAuthCode credentials to MongoDB Realm. // Upon subsequent sign-ins, this returns nil. let credentials = Credentials.google(serverAuthCode: googleUser.serverAuthCode!) app.login(credentials: credentials) { result in DispatchQueue.main.async { switch result { case .failure(let error): print("Failed to log in to MongoDB Realm: \(error)") case .success(let user): print("Successfully logged in to MongoDB Realm using Google OAuth.") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } } } }
Usuario de Apple
Si ha habilitado el inicio de sesión con autenticación de Apple, puede iniciar sesión con el siguiente código:
// Fetch IDToken via the Apple SDK let credentials = Credentials.apple(idToken: "<token>") app.login(credentials: credentials) { (result) in switch result { case .failure(let error): print("Login failed: \(error.localizedDescription)") case .success(let user): print("Successfully logged in as user \(user)") // Now logged in, do something with user // Remember to dispatch to main if you are doing anything on the UI thread } }
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 asíncrono/en espera
Nuevo en la versión 10.15.0.
La versión async/await del método App.login devuelve de forma asincrónica un Usuario o un Error.
func login() async { do { let app = App(id: YOUR_APP_SERVICES_APP_ID) // Authenticate with the instance of the app that points // to your backend. Here, we're using anonymous login. let user = try await app.login(credentials: Credentials.anonymous) print("Successfully logged in user: \(user)") } catch { print("Failed to log in user: \(error.localizedDescription)") } }
A partir de las versiones 10.15.0 y 10.16.0 del SDK de Realm Swift, muchas de las API de Realm admiten la sintaxis async/await de Swift. Los proyectos deben cumplir estos requisitos:
Versión del SDK de Swift | Requisito de versión Swift | Sistema operativo compatible |
|---|---|---|
10.25.0 | Swift 5.6 | iOS 13.x |
10.15.0 o 10.16.0 | Swift 5.5 | iOS 15.x |
Si su aplicación accede a Realm en un contexto async/await, marque el código con @MainActor para evitar fallas relacionadas con subprocesos.
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 the user into the backend app. // The first time you login, the user must have a network connection. func getUser() async throws -> User { // Check for an existing user. // If the user is offline but credentials are // cached, this returns the existing user. if let user = app.currentUser { return user } else { // If the device has no cached user // credentials, log them in. let app = App(id: YOUR_APP_SERVICES_APP_ID) let loggedInUser = try await app.login(credentials: Credentials.anonymous) return loggedInUser } } let user = try await getUser() var configuration = user.configuration(partitionValue: "Some Partition Value") // Open a Realm with this configuration. // If you do not require the app to download updates // before opening the realm, the realm just opens, even if // offline. let realm = try await Realm(configuration: configuration) print("Successfully opened realm: \(realm)")
Obtener un token de acceso de usuario
El SDK de Realm administra automáticamente los tokens de acceso, los actualiza cuando vencen e incluye un token de acceso válido para el usuario actual con cada solicitud.
Si envía solicitudes fuera del SDK, debe incluir el token de acceso del usuario en cada solicitud. En este caso, debe actualizar el token manualmente cuando caduque. Los tokens de acceso caducan después de 30 minutos.
Puedes llamar a la función "refreshCustomData()" en un usuario conectado para actualizar su sesión de autenticación. Luego, devuelve el .accessToken como una cadena que puedes usar en tu código. Puedes usar una función similar a esta para obtener un token de acceso:
func getValidAccessToken(user: User) async throws -> String { // An already logged in user's access token might be stale. To // guarantee that the token is valid, refresh it if necessary. try await user.refreshCustomData() return user.accessToken! }
Lo cual requiere un usuario registrado:
let app = App(id: YOUR_APP_SERVICES_APP_ID) let user = try await app.login(credentials: Credentials.anonymous) let accessToken = try await getValidAccessToken(user: user)
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 sesión
Una vez que haya iniciado sesión, puede cerrar sesión:
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.
app.currentUser?.logOut { (error) in // user is logged out or there was an error }