Ir para o console

Autenticar usando o GitHub no iOS

Permita que os usuários se autentiquem com o Firebase usando provedores OAuth, como o GitHub. Basta integrar o login genérico do OAuth ao seu app usando o SDK do Firebase para realizar o fluxo de login completo.

Antes de começar

Para fazer login de usuários usando contas do GitHub, primeiro ative o GitHub como provedor de login do seu projeto do Firebase:

  1. Adicione o Firebase ao projeto do iOS.
    pod 'Firebase/Auth'
  2. No Console do Firebase, abra a seção Auth.
  3. Na guia Método de login, ative o provedor GitHub.
  4. Adicione o ID do cliente e a chave secreta do cliente do console de desenvolvimento às configurações do provedor.
    1. Registre o app como um aplicativo de desenvolvedor no GitHub e receba o ID do cliente e a chave secreta do cliente do OAuth 2.0 do app.
    2. Em seguida, defina o URI de redirecionamento do OAuth do Firebase, por exemplo, my-app-12345.firebaseapp.com/__/auth/handler, como o URL de retorno de chamada de autorização na página de configurações do app no GitHub (em inglês).
  5. Clique em Salvar.

Processar o fluxo de login com o SDK do Firebase

Para processar o fluxo de login com o SDK do Firebase para iOS, siga estas etapas:

  1. Adicione esquemas de URL personalizado ao seu projeto do XCode:

    1. Abra a configuração do seu projeto clicando duas vezes no nome dele na visualização em árvore à esquerda. Selecione seu app na seção DESTINOS. Em seguida, selecione a guia Informações e expanda a seção Tipos de URL.
    2. Clique no botão "+" e adicione um esquema de URL ao ID do cliente inverso. Para encontrar esse valor, abra o arquivo de configuração GoogleService-Info.plist e procure a chave REVERSED_CLIENT_ID. Copie e cole o valor da chave na caixa Esquemas de URL na página de configuração. Deixe os outros campos em branco.

      Quando concluída, a configuração será semelhante à mostrada a seguir, mas com os valores específicos do seu app:

  2. Crie uma instância de um OAuthProvider usando o código de provedor github.com.

    Swift

        var provider = OAuthProvider(providerID: "github.com")
        

    Objective-C

        FIROAuthProvider *provider = [FIROAuthProvider providerWithProviderID:@"github.com"];
        
  3. Opcional: especifique os parâmetros OAuth personalizados que você quer enviar com a solicitação OAuth.

    Swift

        provider.customParameters = [
          "allow_signup": "false"
        ]
        

    Objective-C

        [provider setCustomParameters:@{@"allow_signup": @"false"}];
        

    Para saber quais parâmetros são aceitos pelo GitHub, consulte a documentação do GitHub do OAuth (em inglês). Não é possível transmitir os parâmetros exigidos pelo Firebase com setCustomParameters. Esses parâmetros são client_id, redirect_uri, response_type, scope e state.

  4. Opcional: especifique os outros escopos de OAuth 2.0 além do perfil básico que você quer solicitar ao provedor de autenticação. Se o aplicativo exigir acesso a dados particulares de usuários das APIs do GitHub, você precisará solicitar permissões para acessá-las em API Permissions, no console de desenvolvimento do GitHub. Os escopos de OAuth solicitados precisam corresponder exatamente àqueles pré-configurados nas permissões de APIs do app.

    Swift

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        provider.scopes = ["user:email"]
        

    Objective-C

        // Request read access to a user's email addresses.
        // This must be preconfigured in the app's API permissions.
        [provider setScopes:@[@"user:email"]];
        

    Para saber mais, consulte a documentação do escopo do GitHub (em inglês).

  5. Opcional: para personalizar a forma como o app apresenta o SFSafariViewController ou o UIWebView ao exibir o reCAPTCHA ao usuário, crie uma classe personalizada que esteja em conformidade com o protocolo FIRAuthUIDelegate e transmita-a para getCredentialWithUIDelegate:completion:.

  6. Use o objeto de provedor do OAuth para a autenticação no Firebase.

    Swift

        provider.getCredentialWith(nil) { credential, error in
          if error != nil {
            // Handle error.
          }
          if credential != nil {
            Auth().signIn(with: credential) { authResult, error in
              if error != nil {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
            }
          }
        }
        

    Objective-C

        [provider getCredentialWithUIDelegate:nil
                                   completion:^(FIRAuthCredential *_Nullable credential,
                                                NSError *_Nullable error) {
          if (error) {
           // Handle error.
          }
          if (credential) {
            [[FIRAuth auth] signInWithCredential:credential
                                      completion:^(FIRAuthDataResult *_Nullable authResult,
                                                NSError *_Nullable error) {
              if (error) {
                // Handle error.
              }
              // User is signed in.
              // IdP data available in authResult.additionalUserInfo.profile.
              // GitHub OAuth access token can also be retrieved by:
              // authResult.credential.accessToken
              // GitHub OAuth ID token can be retrieved by calling:
              // authResult.credential.idToken
            }];
          }
        }];
        

    Com o token de acesso OAuth, é possível chamar a API GitHub (em inglês).

    Por exemplo, para receber informações básicas sobre o perfil, você pode chamar a API REST transmitindo o token de acesso no cabeçalho Authorization:

    https://api.github.com/user
    
  7. Os exemplos acima se concentram nos fluxos de login, mas também é possível vincular um provedor do GitHub a um usuário atual. Por exemplo, vincule vários provedores ao mesmo usuário e permita o login com qualquer um deles.

    Swift

        Auth().currentUser.link(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            linkWithCredential:credential
                    completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // GitHub credential is linked to the current user.
          // IdP data available in authResult.additionalUserInfo.profile.
          // GitHub OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        
  8. É possível usar o mesmo padrão com reauthenticateWithCredential, que pode ser utilizado para recuperar credenciais novas de operações confidenciais que exigem um login recente.

    Swift

        Auth().currentUser.reauthenticateWithCredential(withCredential: credential) { authResult, error in
          if error != nil {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }
        

    Objective-C

        [[FIRAuth auth].currentUser
            reauthenticateWithCredential:credential
                              completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
          if (error) {
            // Handle error.
          }
          // User is re-authenticated with fresh tokens minted and
          // should be able to perform sensitive operations like account
          // deletion and email or password update.
          // IdP data available in result.additionalUserInfo.profile.
          // Additional OAuth access token is can also be retrieved by:
          // authResult.credential.accessToken
          // GitHub OAuth ID token can be retrieved by calling:
          // authResult.credential.idToken
        }];
        

A seguir

Depois que um usuário faz login pela primeira vez, uma nova conta é 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 seus apps, use o objeto FIRUser para receber as informações básicas de perfil do usuário. Consulte Gerenciar usuários.

  • Nas Regras de segurança do Firebase Realtime Database e do Cloud Storage, é possível usar a variável auth para encontrar o código exclusivo do usuário conectado. Utilize essa informação para controlar o acesso dele aos dados.

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:.

Swift

    let firebaseAuth = Auth.auth()
do {
  try firebaseAuth.signOut()
} catch let signOutError as NSError {
  print ("Error signing out: %@", signOutError)
}  

Objective-C

    NSError *signOutError;
BOOL status = [[FIRAuth auth] signOut:&signOutError];
if (!status) {
  NSLog(@"Error signing out: %@", signOutError);
  return;
}

Adicione também o código de gerenciamento dos possíveis erros de autenticação. Consulte Solucionar erros.