Autenticar usuários - SDK do Node.js
Nesta página
- Conecte-se
- Sessões de usuário
- Utilizador anónimo
- Usuário de e-mail/senha
- Usuário da chave de API
- Usuário JWT personalizado
- Usuário de função personalizada
- Usuário do Facebook
- Usuário do Google
- Usuário da Apple
- Login off-line
- Obtenha um token de acesso do usuário
- Atualize a expiração do token
- Desconectar um usuário
Conecte-se
O Realm fornece uma API para autenticar usuários em um aplicativo com qualquer provedor de autenticação habilitado. Instancie um objeto Credentials
e passe-o para o método app.login()
para autenticar um logon de usuário e criar um objeto User
.
Sessões de usuário
O Atlas App Services gerencia sessões com tokens de acesso e atualizam tokens. Os SDKs do cliente fornecem a lógica para gerenciar tokens e fornecem solicitações.
Utilizador anónimo
O provedor Anônimo permite que os usuários façam login em seu aplicativo com contas temporárias que não têm informações associadas.
Para se conectar, crie uma credencial anônima e passe-a para 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);
Usuário de e-mail/senha
O provedor de autenticação por e-mail/senha permite que os usuários se conectem ao seu aplicativo com um endereço de e-mail e uma senha.
Para se conectar, crie uma credencial de e-mail/senha com o endereço de e-mail e a senha do usuário e passe-a para 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);
Usuário da chave de API
O provedor de autenticação da chave de API permite que os processos de servidor acessem seu aplicativo diretamente ou em nome de um usuário.
Para se conectar com uma chave de API, crie uma credencial de chave de API com uma chave de API de servidor ou usuário e passe-a para 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);
Usuário JWT personalizado
O provedor de autenticação JWT personalizado permite que você lide com a autenticação do usuário com qualquer sistema de autenticação que retorne um token da Web JSON.
Para se conectar, crie uma credencial JWT personalizada com um JWT do sistema externo e passe-a para 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);
Usuário de função personalizada
O provedor de autenticação de função personalizada permite lidar com a autenticação do usuário executando uma função que recebe uma carga de informações arbitrárias sobre um usuário.
Para se conectar com o provedor de função personalizada, crie uma credencial de função personalizada com um objeto de carga útil e passe-a para 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);
Usuário do Facebook
O provedor de autenticação do Facebook permite que você autentique usuários por meio de um aplicativo do Facebook usando sua conta existente do Facebook.
Importante
Habilite o provedor de autenticação do Facebook
Para conectar um usuário com uma conta do Facebook existente, você deve configurar e habilitar o provedor de autenticação do Facebook para seu aplicativo.
Importante
Não armazene URLs de fotos de perfil do Facebook
Os URLs da imagem de perfil do Facebook incluem o token de acesso do usuário para conceder permissão à imagem. Para garantir a segurança, não armazene um URL que inclua um token de acesso do usuário. Em vez disso, acesse o URL diretamente dos campos de metadados do usuário quando precisar buscar a imagem.
Você pode usar o SDK oficial do Facebook para lidar com a autenticação do usuário e redirecionar o fluxo de um aplicação cliente . Quando autenticado, o SDK do Facebook retorna um token de acesso que você pode enviar para sua aplicação Node.js e usar para acabar de conectar o usuário à sua aplicação.
// 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);
Usuário do Google
O provedor de autenticação do Google permite autenticar usuários por meio de um projeto do Google usando a conta do Google existente.
Observação
Habilitar o provedor de autenticação do Google
Para autenticar um usuário do Google, você deve configurar o provedor de autenticação do Google. Você deve habilitar o OpenID Connect para usar o provedor de autenticação do Google com o Node.js SDK.
Para configurar seu aplicativo para autenticação de usuário do Google na configuração do seu aplicativo:
No console do Google Cloud Platform, crie um OAuth 2.0 ID do cliente do tipo "aplicativo Web".
Configure seu aplicativo de backend para usar esse ID de cliente e o segredo de cliente associado.
Habilite o OpenID Connect no backend.
Use a Google Auth Library para Node.js oficial para gerenciar a autenticação do usuário e redirecionar o fluxo de um aplicativo cliente Node.js:
Instale os pacotes Realm e Google APIs npm.
npm install realm googleapis Importe os pacotes para o seu projeto.
const Realm = require("realm"); const { google } = require("googleapis"); Criar configuração para o cliente Google OAuth 2,0 e 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, }); Gere um link de login OAuth e passe para o cliente do aplicativo.
// 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, }); Processe a solicitação do servidor de autenticação do Google, que inclui um código de acesso na string de query usando o método
getToken()
do cliente Google OAuth 2.0. Na função de retorno de chamada, entre em seu aplicativo utilizando oid_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); } });
Exemplo
Autenticar com o Google em um servidor Node.js
Consulte o código para ver um exemplo de servidor Node.js que implementa o Sign in With Google. Todos os 2 do Google OAuth .0 a implementação está no arquivo server.js
.
O exemplo usa Express para roteamento e a Biblioteca de autenticação do Google para Node.js.
Talvez você queira se autenticar com o Google em um servidor Node.js para executar operações do lado do servidor em nome de um usuário, como chamar uma função Atlas com as credenciais de um usuário.
Usuário da Apple
O provedor de autenticação Apple permite que você autentique usuários por meio do Sign-in With Apple.
Observação
Habilite o provedor de autenticação da Apple
Para autenticar um usuário da Apple, você deve configurar o provedor de autenticação da Apple.
Você pode usar o login oficial com o Apple JavaScript SDK para lidar com a autenticação do usuário e redirecionar o fluxo de um aplicação cliente . Quando autenticado, o SDK do JavaScript da Apple retorna um token de ID que você pode enviar para sua aplicação Node.js e usar para acabar de conectar o usuário à sua aplicação.
// 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);
Dica
Se você receber uma mensagem de erro Login failed
dizendo que o token contains
an invalid number of segments
, verifique se está passando uma versão de string codificada em UTF-8 do JWT.
Login off-line
Quando seu aplicativo Realm autentica um usuário, armazena em cache as credenciais do usuário. Você pode verificar as credenciais de usuário existentes para ignorar o fluxo de login e acessar o usuário em cache. Use isto para abrir um realm offline.
Observação
O login inicial exige uma conexão de rede
Quando um usuário se inscreve em seu aplicativo ou faz login pela primeira vez com uma conta existente em um cliente, o cliente deve ter uma conexão de rede. A verificação de credenciais de usuário em cache permite que você abra um domínio offline, mas somente se o usuário já tiver feito login enquanto estiver online.
// 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 saber como usar o usuário em cache na Configuração Sincronizada e acessar um domínio enquanto estiver off-line, leia a documentação Open a Synced Realm While Offline (Abrir um domínio sincronizado enquanto estiver off-line ).
Obtenha um token de acesso do usuário
Quando um usuário se conecta, o Atlas App Services cria um token de acesso para o usuário que lhe concede acesso à sua aplicação. O Realm SDK gerencia automaticamente os tokens de acesso, atualiza-os quando expiram e inclui um token de acesso válido para o usuário atual em cada solicitação. O Realm não atualiza automaticamente o token de atualização. Quando o token de atualização expira, o usuário deve se conectar novamente.
Se você enviar solicitações fora do SDK, precisará incluir o token de acesso do usuário em cada solicitação e atualizar manualmente o token quando ele expirar.
Você pode acessar e atualizar um token de acesso de usuário conectado ao SDK a partir de seu objeto Realm.User
, como no seguinte exemplo:
// 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; }
Atualize a expiração do token
A atualização dos tokens expira após um período de tempo definido. Quando o token de atualização expira, o token de acesso não pode mais ser atualizado e o usuário deve se conectar novamente.
Se o token de atualização expirar após a abertura do domínio, o dispositivo não poderá sincronizar até que o usuário faça login novamente. Seu manipulador de erros de sincronização deve implementar uma lógica que capture um erro de token expirado ao tentar sincronizar e, em seguida, redirecionar os usuários para um fluxo de login.
Para obter informações sobre como configurar a expiração do token de atualização, consulte Gerencie sessões de usuário na documentação do App Services.
Desconectar um usuário
Para desconectar qualquer usuário, chame o User.logOut()
em sua instância de usuário.
Aviso
Se o usuário se desconectar, você não poderá mais ler ou gravar dados em nenhum domínio sincronizado que o usuário tenha aberto. Consequentemente, qualquer operação que ainda não tenha sido concluída antes de o usuário iniciar o logout não poderá ser concluída com êxito e provavelmente resultará em erro. Todos os dados de uma operação de gravação que falhar dessa forma serão perdidos.
// Log out the current user await app.currentUser?.logOut();