Autenticar usando o Twitter em JavaScript

Permita que os usuários se autentiquem com o Firebase usando contas do Twitter ao integrar a autenticação do Twitter ao seu app. Integre a autenticação do Twitter usando o SDK do Firebase para realizar o fluxo de login ou executando manualmente o fluxo do OAuth do Twitter e enviando o token de acesso e o secret resultantes ao Firebase.

Antes de começar

  1. Adicione o Firebase ao seu projeto em JavaScript.
  2. No console do Firebase, abra a seção Autenticação.
  3. Na guia Método de login, ative o provedor Twitter.
  4. Adicione a chave de API e a chave secreta da API do console de desenvolvimento do provedor à configuração dele:
    1. Registre o app como um aplicativo de desenvolvedor no Twitter e receba a chave de API e a chave secreta da API do OAuth do app.
    2. Em seguida, verifique se o URI de redirecionamento do OAuth do Firebase (por exemplo, my-app-12345.firebaseapp.com/__/auth/handler) está definido como o URL de retorno de chamada de autorização na página de configurações do app no Twitter.
  5. Clique em Salvar.

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 Twitter é processando o fluxo de login com o SDK do Firebase para JavaScript. (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:

  1. Crie uma instância do objeto de provedor do Twitter:
    import { TwitterAuthProvider } from "firebase/auth";

    const provider = new TwitterAuthProvider();
    var provider = new firebase.auth.TwitterAuthProvider();
  2. 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();
  3. 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({
     
    'lang': 'es'
    });
    provider.setCustomParameters({
     
    'lang': 'es'
    });
    Os parâmetros de OAuth reservados e obrigatórios não são permitidos e serão ignorados. Consulte a referência do provedor de autenticação para saber mais.
  4. Use o objeto de provedor do Twitter para a autenticação no Firebase. Você pode solicitar que os usuários façam login nas contas do Twitter deles em uma nova janela pop-up ou com redirecionamento para a página de login. O método de redirecionamento é recomendável para dispositivos móveis.
    • Para fazer login com uma janela pop-up, chame signInWithPopup:
      import { getAuth, signInWithPopup, TwitterAuthProvider } from "firebase/auth";

      const auth = getAuth();
      signInWithPopup
      (auth, provider)
       
      .then((result) => {
         
      // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
         
      // You can use these server side with your app's credentials to access the Twitter API.
         
      const credential = TwitterAuthProvider.credentialFromResult(result);
         
      const token = credential.accessToken;
         
      const secret = credential.secret;

         
      // The signed-in user info.
         
      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;
         
      // The AuthCredential type that was used.
         
      const credential = TwitterAuthProvider.credentialFromError(error);
         
      // ...
       
      });
      firebase
       
      .auth()
       
      .signInWithPopup(provider)
       
      .then((result) => {
         
      /** @type {firebase.auth.OAuthCredential} */
         
      var credential = result.credential;

         
      // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
         
      // You can use these server side with your app's credentials to access the Twitter API.
         
      var token = credential.accessToken;
         
      var secret = credential.secret;

         
      // 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;
         
      // ...
       
      });
      Também é possível recuperar o token de OAuth do provedor do Twitter, que pode ser usado para buscar dados adicionais usando as APIs do Twitter.

      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);
      Em seguida, também é possível recuperar o token de OAuth do provedor do Twitter. Basta chamar getRedirectResult quando sua página carregar:
      import { getAuth, getRedirectResult, TwitterAuthProvider } from "firebase/auth";

      const auth = getAuth();
      getRedirectResult
      (auth)
       
      .then((result) => {
         
      // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
         
      // You can use these server side with your app's credentials to access the Twitter API.
         
      const credential = TwitterAuthProvider.credentialFromResult(result);
         
      const token = credential.accessToken;
         
      const secret = credential.secret;
         
      // ...

         
      // The signed-in user info.
         
      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;
         
      // The AuthCredential type that was used.
         
      const credential = TwitterAuthProvider.credentialFromError(error);
         
      // ...
       
      });
      firebase.auth()
       
      .getRedirectResult()
       
      .then((result) => {
         
      if (result.credential) {
           
      /** @type {firebase.auth.OAuthCredential} */
           
      var credential = result.credential;

           
      // This gives you a the Twitter OAuth 1.0 Access Token and Secret.
           
      // You can use these server side with your app's credentials to access the Twitter API.
           
      var token = credential.accessToken;
           
      var secret = credential.secret;
           
      // ...
         
      }

         
      // 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;
         
      // ...
       
      });
      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.

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 Twitter) 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 (secret e token OAuth do Twitter). 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 (secret e token OAuth do Twitter).

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
,
 
TwitterAuthProvider,
} from "firebase/auth";

try {
 
// Step 1: User tries to sign in using Twitter.
  let result
= await signInWithPopup(getAuth(), new TwitterAuthProvider());
} catch (error) {
 
// Step 2: User's email already exists.
 
if (error.code === "auth/account-exists-with-different-credential") {
   
// The pending Twitter 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 Twitter 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

A correção desse erro é similar no modo de redirecionamento. No entanto, nele, as credenciais pendentes devem ser armazenadas em cache entre os redirecionamentos das páginas usando, por exemplo, o armazenamento de sessão.

Processar o fluxo de login manualmente

Você também pode usar uma conta do Twitter para a autenticação no Firebase. Basta processar o fluxo de login com uma chamada para os endpoints do OAuth do Twitter:

  1. Para integrar a autenticação do Twitter ao seu app, siga as instruções da documentação do desenvolvedor. No final do fluxo de login do Twitter, você receberá um token de acesso e uma chave secreta OAuth.
  2. Se você precisar fazer login em um aplicativo Node.js, envie o token de acesso e a chave secreta OAuth para o aplicativo Node.js.
  3. Depois que um usuário se conectar com o Twitter, troque o token de acesso e chave secreta OAuth por uma credencial do Firebase:
    var credential = firebase.auth.TwitterAuthProvider.credential(token, secret);
  4. Use a credencial do Firebase para fazer a autenticação:
    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.

Ao criar o projeto, o Firebase vai provisionar um subdomínio exclusivo para ele: https://my-app-12345.firebaseapp.com.

Esse subdomínio também será usado como mecanismo de redirecionamento para o login do OAuth. Esse domínio precisaria ter permissão para todos os provedores OAuth com suporte. No entanto, isso significa que os usuários podem ver esse domínio ao entrarem no Twitter, antes de serem redirecionados para o aplicativo: Prossiga para: https://my-app-12345.firebaseapp.com

Para evitar a exibição do subdomínio, configure um domínio personalizado com Firebase Hosting:

  1. 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.
  2. Adicione o domínio personalizado à lista de domínios autorizados no console do Firebase: auth.custom.domain.com.
  3. Na página de configuração do OAuth ou no console do desenvolvedor do Twitter, coloque na lista de permissões o URL da página de redirecionamento, que ficará acessível no seu domínio personalizado: https://auth.custom.domain.com/__/auth/handler.
  4. Ao inicializar a biblioteca do JavaScript, especifique seu domínio personalizado com o campo authDomain:
    var config = {
      apiKey
    : '...',
     
    // Changed from 'my-app-12345.firebaseapp.com'.
      authDomain
    : 'auth.custom.domain.com',
      databaseURL
    : 'https://my-app-12345.firebaseio.com',
      projectId
    : 'my-app-12345',
      storageBucket
    : 'my-app-12345.appspot.com',
      messagingSenderId
    : '1234567890'
    };
    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 objeto User. 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.
});