Permita que os usuários se autentiquem com o Firebase usando contas do Facebook. Basta integrar o login da rede social ao seu app com o SDK do Firebase para realizar o fluxo de login ou transmitir o token de acesso resultante para o Firebase manualmente.
Antes de começar
- Adicione o Firebase ao seu projeto do JavaScript.
- No site Facebook for Developers, acesse o ID e o secret do app.
- Ative o login do Facebook:
- No console do Firebase, abra a seção Autenticação.
- Na guia Método de login, ative o método de login pelo Facebook e especifique o ID e o Secret do app recebidos do Facebook.
- Em seguida, verifique se o URI de redirecionamento do OAuth (por exemplo,
my-app-12345.firebaseapp.com/__/auth/handler
) está listado como um dos URIs de redirecionamento do OAuth na página de configurações do app Facebook. No site Facebook for Developers, acesse Product Settings > Facebook Login.
Processar o fluxo de login com o SDK do Firebase
Se você está desenvolvendo um app da Web, a maneira mais fácil de autenticar seus usuários com o Firebase usando contas do Facebook é processando o fluxo de login com o SDK para JavaScript do Firebase. Se quiser autenticar um usuário no Node.js ou outro ambiente fora do navegador, precisará processar o fluxo de login manualmente.
Para processar o fluxo de login com o SDK do Firebase para JavaScript, siga estas etapas:
- Crie uma instância do objeto do provedor do Facebook:
import { FacebookAuthProvider } from "firebase/auth"; const provider = new FacebookAuthProvider();
var provider = new firebase.auth.FacebookAuthProvider();
- Opcional: especifique escopos adicionais do OAuth 2.0 que você
quer solicitar do provedor de autenticação. Para adicionar um escopo, chame
addScope
. Por exemplo:provider.addScope('user_birthday');
provider.addScope('user_birthday');
- Opcional: para localizar o fluxo de OAuth do provedor para o idioma preferido do usuário sem transmitir explicitamente os parâmetros de OAuth personalizados relevantes, atualize o código do idioma na instância de Auth antes de iniciar o fluxo de OAuth. Por exemplo:
import { getAuth } from "firebase/auth"; const auth = getAuth(); auth.languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // auth.useDeviceLanguage();
firebase.auth().languageCode = 'it'; // To apply the default browser preference instead of explicitly setting it. // firebase.auth().useDeviceLanguage();
- Opcional: especifique outros parâmetros personalizados do provedor de OAuth
que quiser enviar com a solicitação de OAuth. Para adicioná-los, chame
setCustomParameters
no provedor inicializado usando um objeto que tenha a chave especificada na documentação do provedor de OAuth e o valor correspondente. Por exemplo:provider.setCustomParameters({ 'display': 'popup' });
provider.setCustomParameters({ 'display': 'popup' });
- Faça a autenticação com o Firebase usando o objeto de provedor do Facebook. É possível
solicitar que os usuários façam login com a conta deles do Facebook por
uma janela pop-up ou redirecionando-os à página de login do provedor. O método de redirecionamento é bom para dispositivos móveis.
- Para fazer login com uma janela pop-up, chame
signInWithPopup
:import { getAuth, signInWithPopup, FacebookAuthProvider } from "firebase/auth"; const auth = getAuth(); signInWithPopup(auth, provider) .then((result) => { // The signed-in user info. const user = result.user; // This gives you a Facebook Access Token. You can use it to access the Facebook API. const credential = FacebookAuthProvider.credentialFromResult(result); const accessToken = credential.accessToken; // IdP data available using getAdditionalUserInfo(result) // ... }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... });
firebase .auth() .signInWithPopup(provider) .then((result) => { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // The signed-in user info. var user = result.user; // IdP data available in result.additionalUserInfo.profile. // ... // This gives you a Facebook Access Token. You can use it to access the Facebook API. var accessToken = credential.accessToken; // ... }) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... });
Também é aqui que você identifica e corrige erros. Para conferir uma lista de códigos de erro, consulte os Documentos de referência de autenticação.
- Para redirecionar os usuários à página de login, chame
signInWithRedirect
: siga as práticas recomendadas ao usar "signInWithRedirect".import { getAuth, signInWithRedirect } from "firebase/auth"; const auth = getAuth(); signInWithRedirect(auth, provider);
firebase.auth().signInWithRedirect(provider);
getRedirectResult
quando a página carregar:import { getAuth, getRedirectResult, FacebookAuthProvider } from "firebase/auth"; const auth = getAuth(); getRedirectResult(auth) .then((result) => { // This gives you a Facebook Access Token. You can use it to access the Facebook API. const credential = FacebookAuthProvider.credentialFromResult(result); const token = credential.accessToken; const user = result.user; // IdP data available using getAdditionalUserInfo(result) // ... }).catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... });
firebase.auth() .getRedirectResult() .then((result) => { if (result.credential) { /** @type {firebase.auth.OAuthCredential} */ var credential = result.credential; // This gives you a Facebook Access Token. You can use it to access the Facebook API. var token = credential.accessToken; // ... } // The signed-in user info. var user = result.user; // IdP data available in result.additionalUserInfo.profile. // ... }).catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... });
- Para fazer login com uma janela pop-up, chame
Processar erros account-exists-with-different-credential
Se você ativou a configuração Uma conta por endereço de e-mail no console do Firebase,
quando um usuário tentar se conectar a um provedor (como o Facebook) com um e-mail que já existe
em outro provedor de usuários do Firebase (como o Google), o erro
auth/account-exists-with-different-credential
será exibido com um objeto
AuthCredential
(token de acesso do Facebook). Para concluir o login no
provedor pretendido, primeiro o usuário precisa fazer login no provedor atual (Google) e, em seguida, vinculá-lo ao
AuthCredential
anterior (token de acesso do Facebook).
Modo de pop-up
Se você usar signInWithPopup
, poderá corrigir erros auth/account-exists-with-different-credential
utilizando código, como o do exemplo a seguir:
import { getAuth, linkWithCredential, signInWithPopup, FacebookAuthProvider, } from "firebase/auth"; try { // Step 1: User tries to sign in using Facebook. let result = await signInWithPopup(getAuth(), new FacebookAuthProvider()); } catch (error) { // Step 2: User's email already exists. if (error.code === "auth/account-exists-with-different-credential") { // The pending Facebook credential. let pendingCred = error.credential; // Step 3: Save the pending credential in temporary storage, // Step 4: Let the user know that they already have an account // but with a different provider, and let them choose another // sign-in method. } } // ... try { // Step 5: Sign the user in using their chosen method. let result = await signInWithPopup(getAuth(), userSelectedProvider); // Step 6: Link to the Facebook credential. // TODO: implement `retrievePendingCred` for your app. let pendingCred = retrievePendingCred(); if (pendingCred !== null) { // As you have access to the pending credential, you can directly call the // link method. let user = await linkWithCredential(result.user, pendingCred); } // Step 7: Continue to app. } catch (error) { // ... }
Modo de redirecionamento
O processamento desse erro é similar no modo de redirecionamento. No entanto, nele, as credenciais pendentes devem ser armazenadas em cache entre os redirecionamentos de página usando, por exemplo, o armazenamento de sessão.
Avançado: processar o fluxo de login manualmente
Você também pode fazer a autenticação com o Firebase usando uma conta do Facebook por meio do fluxo de login com o SDK para JavaScript de Login do Facebook:
- Integre o Login do Facebook no seu app de acordo com os documentos do desenvolvedor.
Não deixe de configurar o login do Facebook com o respectivo ID do app:
<script src="//connect.facebook.net/en_US/sdk.js"></script> <script> FB.init({ /********************************************************************** * TODO(Developer): Change the value below with your Facebook app ID. * **********************************************************************/ appId: '<YOUR_FACEBOOK_APP_ID>', status: true, xfbml: true, version: 'v2.6', }); </script>
-
Também configuramos um listener no estado de autenticação do Facebook:
FB.Event.subscribe('auth.authResponseChange', checkLoginState);
- Após integrar o login do Facebook, adicione um botão de login do Facebook em suas páginas da Web:
<fb:login-button data-auto-logout-link="true" scope="public_profile,email" size="large" ></fb:login-button>
- No callback sobre o estado de autenticação do Facebook, troque o token da resposta de autenticação do Facebook por uma credencial do Firebase e faça login nessa plataforma:
import { getAuth, onAuthStateChanged, signInWithCredential, signOut, FacebookAuthProvider } from "firebase/auth"; const auth = getAuth(); function checkLoginState(response) { if (response.authResponse) { // User is signed-in Facebook. const unsubscribe = onAuthStateChanged(auth, (firebaseUser) => { unsubscribe(); // Check if we are already signed-in Firebase with the correct user. if (!isUserEqual(response.authResponse, firebaseUser)) { // Build Firebase credential with the Facebook auth token. const credential = FacebookAuthProvider.credential( response.authResponse.accessToken); // Sign in with the credential from the Facebook user. signInWithCredential(auth, credential) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... }); } else { // User is already signed-in Firebase with the correct user. } }); } else { // User is signed-out of Facebook. signOut(auth); } }
function checkLoginState(response) { if (response.authResponse) { // User is signed-in Facebook. var unsubscribe = firebase.auth().onAuthStateChanged((firebaseUser) => { unsubscribe(); // Check if we are already signed-in Firebase with the correct user. if (!isUserEqual(response.authResponse, firebaseUser)) { // Build Firebase credential with the Facebook auth token. var credential = firebase.auth.FacebookAuthProvider.credential( response.authResponse.accessToken); // Sign in with the credential from the Facebook user. firebase.auth().signInWithCredential(credential) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... }); } else { // User is already signed-in Firebase with the correct user. } }); } else { // User is signed-out of Facebook. firebase.auth().signOut(); } }
- Além disso, verifique também se o usuário do Facebook já fez login no Firebase para evitar uma nova autenticação desnecessária:
import { FacebookAuthProvider } from "firebase/auth"; function isUserEqual(facebookAuthResponse, firebaseUser) { if (firebaseUser) { const providerData = firebaseUser.providerData; for (let i = 0; i < providerData.length; i++) { if (providerData[i].providerId === FacebookAuthProvider.PROVIDER_ID && providerData[i].uid === facebookAuthResponse.userID) { // We don't need to re-auth the Firebase connection. return true; } } } return false; }
function isUserEqual(facebookAuthResponse, firebaseUser) { if (firebaseUser) { var providerData = firebaseUser.providerData; for (var i = 0; i < providerData.length; i++) { if (providerData[i].providerId === firebase.auth.FacebookAuthProvider.PROVIDER_ID && providerData[i].uid === facebookAuthResponse.userID) { // We don't need to re-auth the Firebase connection. return true; } } } return false; }
Avançado: autenticar com o Firebase no Node.js
Para autenticar com o Firebase em um app Node.js:
- Faça login do usuário com a conta dele do Facebook e receba o token de acesso do Facebook do usuário. Por exemplo, faça login do usuário em um navegador conforme descrito na seção Processar fluxo de login manualmente, mas envie o token de acesso ao seu app do Node.js em vez de usá-lo no app do cliente.
- Depois de receber o token de acesso do Facebook, use-o para criar um
objeto de credencial e faça o login do usuário com essa credencial:
import { getAuth, signInWithCredential, FacebookAuthProvider } from "firebase/auth"; // Sign in with the credential from the Facebook user. const auth = getAuth(); signInWithCredential(auth, credential) .then((result) => { // Signed in const credential = FacebookAuthProvider.credentialFromResult(result); }) .catch((error) => { // Handle Errors here. const errorCode = error.code; const errorMessage = error.message; // The email of the user's account used. const email = error.customData.email; // The AuthCredential type that was used. const credential = FacebookAuthProvider.credentialFromError(error); // ... });
// Sign in with the credential from the Facebook user. firebase.auth().signInWithCredential(credential) .then((result) => { // Signed in var credential = result.credential; // ... }) .catch((error) => { // Handle Errors here. var errorCode = error.code; var errorMessage = error.message; // The email of the user's account used. var email = error.email; // The firebase.auth.AuthCredential type that was used. var credential = error.credential; // ... });
Autenticar com Firebase em uma extensão do Chrome
Se você estiver criando um app de extensão do Google Chrome, consulte a Guia de documentos fora da tela.
Como personalizar o domínio de redirecionamento para o login do Facebook
O Firebase vai provisionar um subdomínio exclusivo para o projeto no momento da criação:
https://my-app-12345.firebaseapp.com
.
Esse subdomínio também será usado como mecanismo de redirecionamento para o login do OAuth. O domínio precisaria ter permissão para todos os provedores do OAuth com suporte. No entanto, isso significa que os usuários talvez vejam esse domínio ao fazer login no Facebook antes de serem redirecionados para o aplicativo: Continuar para: https://my-app-12345.firebaseapp.com.
Para evitar a exibição do subdomínio, configure um domínio personalizado com o Firebase Hosting:
- Siga as etapas de 1 a 3 em Configurar o domínio para o Hosting. Quando você verifica a propriedade do domínio, o Hosting provisiona um certificado SSL para o domínio personalizado.
- Adicione o domínio personalizado à lista de domínios autorizados no
console do Firebase:
auth.custom.domain.com
. - No console para desenvolvedores do Facebook ou na página de configuração do OAuth, adicione o URL da página de redirecionamento à lista de permissões, que estará acessível no seu domínio personalizado:
https://auth.custom.domain.com/__/auth/handler
. - Ao inicializar a biblioteca do JavaScript, especifique seu domínio personalizado com o campo
authDomain
:var config = { apiKey: '...', // Changed from '
PROJECT_ID .firebaseapp.com'. authDomain: 'auth.custom.domain.com', databaseURL: 'https://PROJECT_ID .firebaseio.com', projectId: 'PROJECT_ID ', storageBucket: ' ', messagingSenderId: 'PROJECT_ID .firebasestorage.appSENDER_ID ' }; firebase.initializeApp(config);
Próximas etapas
Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada às credenciais, que podem ser o número do telefone, o nome de usuário e a senha ou as informações do provedor de autenticação. Essa nova conta é armazenada como parte do projeto do Firebase e pode ser usada para identificar um usuário em todos os apps do projeto, seja qual for o método de login utilizado.
-
Nos apps, a maneira recomendada de saber o status de autenticação do seu usuário é definindo um observador no objeto
Auth
. É possível, então, receber as informações básicas de perfil do usuário do objetoUser
. Consulte Gerenciar usuários. Nas Regras de segurança Firebase Realtime Database e Cloud Storage, você pode acessar o ID exclusivo do usuário conectado pela variável
auth
e usar essas informações para controlar quais dados um usuário pode acessar.
Os usuários podem fazer login no app usando vários provedores de autenticação. Basta vincular as credenciais desses provedores a uma conta de usuário.
Para desconectar um usuário, chame signOut
:
import { getAuth, signOut } from "firebase/auth"; const auth = getAuth(); signOut(auth).then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });
firebase.auth().signOut().then(() => { // Sign-out successful. }).catch((error) => { // An error happened. });