Autenticar usando o login do Google em plataformas Apple

Você pode permitir que seus usuários se autentiquem no Firebase usando suas Contas do Google integrando o Login do Google ao seu aplicativo.

Antes de você começar

Use o Swift Package Manager para instalar e gerenciar dependências do Firebase.

  1. No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
  2. Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
  3.   https://github.com/firebase/firebase-ios-sdk.git
  4. Escolha a biblioteca Firebase Authentication.
  5. Adicione o sinalizador -ObjC à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino.
  6. Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.

Adicione o SDK de login do Google ao seu projeto

  1. No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .

  2. Quando solicitado, adicione o repositório do SDK de login do Google:

    https://github.com/google/GoogleSignIn-iOS
    
  3. Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.

Ative o login do Google para seu projeto do Firebase

Para permitir que os usuários façam login usando o Login do Google, primeiro você precisa ativar o provedor de Login do Google para seu projeto do Firebase:

  1. No console do Firebase , abra a seção Autenticação .
  2. Na guia Método de login , habilite o provedor Google .
  3. Clique em Salvar .

  4. Baixe uma nova cópia do arquivo GoogleService-Info.plist do seu projeto e copie-a para o seu projeto Xcode. Substitua quaisquer versões existentes pela nova. (Consulte Adicionar o Firebase ao seu projeto iOS .)

Importe os arquivos de cabeçalho necessários

Primeiro, você deve importar os arquivos de cabeçalho do SDK do Firebase e do SDK de login do Google para seu aplicativo.

Rápido

import FirebaseCore
import FirebaseAuth
import GoogleSignIn

Objetivo-C

@import FirebaseCore;
@import GoogleSignIn;

Implementar o Login do Google

Implemente o Login do Google seguindo estas etapas. Consulte a documentação do desenvolvedor do Login do Google para obter detalhes sobre como usar o Login do Google com iOS.

  1. Adicione esquemas de URL personalizados ao seu projeto Xcode:
    1. Abra a configuração do seu projeto: clique no nome do projeto na visualização em árvore à esquerda. Selecione seu aplicativo na seção TARGETS , selecione a guia Informações e expanda a seção Tipos de URL .
    2. Clique no botão + e adicione um esquema de URL para seu ID de cliente invertido. Para encontrar esse valor, abra o arquivo de configuração GoogleService-Info.plist e procure a chave REVERSED_CLIENT_ID . Copie o valor dessa chave e cole-o na caixa Esquemas de URL na página de configuração. Deixe os outros campos intactos.

      Quando concluída, sua configuração deverá ser semelhante à seguinte (mas com os valores específicos do seu aplicativo):

  2. No application:didFinishLaunchingWithOptions: do delegado do seu aplicativo, configure o objeto FirebaseApp .

    Rápido

    FirebaseApp.configure()
    

    Objetivo-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
  3. Implemente o application:openURL:options: do delegado do seu aplicativo. O método deve chamar o método handleURL da instância GIDSignIn , que tratará adequadamente a URL que sua aplicação recebe ao final do processo de autenticação.

    Rápido

    func application(_ app: UIApplication,
                     open url: URL,
                     options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
      return GIDSignIn.sharedInstance.handle(url)
    }
    

    Objetivo-C

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url];
    }
    
  4. Passe o controlador de visualização apresentado e o ID do cliente do seu aplicativo para o método signIn do provedor de login do Google e crie uma credencial do Firebase Authentication a partir do token de autenticação do Google resultante:

    Rápido

    guard let clientID = FirebaseApp.app()?.options.clientID else { return }
    
    // Create Google Sign In configuration object.
    let config = GIDConfiguration(clientID: clientID)
    GIDSignIn.sharedInstance.configuration = config
    
    // Start the sign in flow!
    GIDSignIn.sharedInstance.signIn(withPresenting: self) { [unowned self] result, error in
      guard error == nil else {
        // ...
      }
    
      guard let user = result?.user,
        let idToken = user.idToken?.tokenString
      else {
        // ...
      }
    
      let credential = GoogleAuthProvider.credential(withIDToken: idToken,
                                                     accessToken: user.accessToken.tokenString)
    
      // ...
    }
    

    Objetivo-C

    GIDConfiguration *config = [[GIDConfiguration alloc] initWithClientID:[FIRApp defaultApp].options.clientID];
    [GIDSignIn.sharedInstance setConfiguration:config];
    
    __weak __auto_type weakSelf = self;
    [GIDSignIn.sharedInstance signInWithPresentingViewController:self
          completion:^(GIDSignInResult * _Nullable result, NSError * _Nullable error) {
      __auto_type strongSelf = weakSelf;
      if (strongSelf == nil) { return; }
    
      if (error == nil) {
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:result.user.idToken.tokenString
                                         accessToken:result.user.accessToken.tokenString];
        // ...
      } else {
        // ...
      }
    }];
    
    
  5. Adicione um GIDSignInButton ao seu storyboard, arquivo XIB ou instancie-o programaticamente. Para adicionar o botão ao seu storyboard ou arquivo XIB, adicione um View e defina sua classe personalizada como GIDSignInButton .
  6. Opcional : se quiser personalizar o botão, faça o seguinte:

    Rápido

    1. No seu controlador de visualização, declare o botão de login como uma propriedade.
      @IBOutlet weak var signInButton: GIDSignInButton!
    2. Conecte o botão à propriedade signInButton que você acabou de declarar.
    3. Personalize o botão definindo as propriedades do objeto GIDSignInButton .

    Objetivo-C

    1. No arquivo de cabeçalho do seu controlador de visualização, declare o botão de login como uma propriedade.
      @property(weak, nonatomic) IBOutlet GIDSignInButton *signInButton;
    2. Conecte o botão à propriedade signInButton que você acabou de declarar.
    3. Personalize o botão definindo as propriedades do objeto GIDSignInButton .

Autenticar com Firebase

Por fim, conclua o processo de login do Firebase com a credencial de autenticação criada na etapa anterior.

Rápido

Auth.auth().signIn(with: credential) { result, error in

  // At this point, our user is signed in
}
    

Objetivo-C

[[FIRAuth auth] signInWithCredential:credential
                          completion:^(FIRAuthDataResult * _Nullable authResult,
                                       NSError * _Nullable error) {
    if (isMFAEnabled && error && error.code == FIRAuthErrorCodeSecondFactorRequired) {
      FIRMultiFactorResolver *resolver = error.userInfo[FIRAuthErrorUserInfoMultiFactorResolverKey];
      NSMutableString *displayNameString = [NSMutableString string];
      for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
        [displayNameString appendString:tmpFactorInfo.displayName];
        [displayNameString appendString:@" "];
      }
      [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Select factor to sign in\n%@", displayNameString]
                           completionBlock:^(BOOL userPressedOK, NSString *_Nullable displayName) {
       FIRPhoneMultiFactorInfo* selectedHint;
       for (FIRMultiFactorInfo *tmpFactorInfo in resolver.hints) {
         if ([displayName isEqualToString:tmpFactorInfo.displayName]) {
           selectedHint = (FIRPhoneMultiFactorInfo *)tmpFactorInfo;
         }
       }
       [FIRPhoneAuthProvider.provider
        verifyPhoneNumberWithMultiFactorInfo:selectedHint
        UIDelegate:nil
        multiFactorSession:resolver.session
        completion:^(NSString * _Nullable verificationID, NSError * _Nullable error) {
          if (error) {
            [self showMessagePrompt:error.localizedDescription];
          } else {
            [self showTextInputPromptWithMessage:[NSString stringWithFormat:@"Verification code for %@", selectedHint.displayName]
                                 completionBlock:^(BOOL userPressedOK, NSString *_Nullable verificationCode) {
             FIRPhoneAuthCredential *credential =
                 [[FIRPhoneAuthProvider provider] credentialWithVerificationID:verificationID
                                                              verificationCode:verificationCode];
             FIRMultiFactorAssertion *assertion = [FIRPhoneMultiFactorGenerator assertionWithCredential:credential];
             [resolver resolveSignInWithAssertion:assertion completion:^(FIRAuthDataResult * _Nullable authResult, NSError * _Nullable error) {
               if (error) {
                 [self showMessagePrompt:error.localizedDescription];
               } else {
                 NSLog(@"Multi factor finanlize sign in succeeded.");
               }
             }];
           }];
          }
        }];
     }];
    }
  else if (error) {
    // ...
    return;
  }
  // User successfully signed in. Get user data from the FIRUser object
  if (authResult == nil) { return; }
  FIRUser *user = authResult.user;
  // ...
}];

Próximos passos

Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é criada e vinculada às credenciais (ou seja, nome de usuário e senha, número de telefone ou informações do provedor de autenticação) com as quais o usuário fez login. Essa nova conta é armazenada como parte do seu projeto do Firebase e pode ser usada para identificar um usuário em todos os aplicativos do seu projeto, independentemente de como o usuário faz login.

  • Nos seus aplicativos, você pode obter as informações básicas do perfil do usuário no objeto User . Consulte Gerenciar usuários .

  • Nas regras de segurança do Firebase Realtime Database e do Cloud Storage , você pode obter o ID de usuário exclusivo do usuário conectado na variável auth e usá-lo para controlar quais dados um usuário pode acessar.

Você pode permitir que os usuários façam login no seu aplicativo usando vários provedores de autenticação vinculando as credenciais do provedor de autenticação a uma conta de usuário existente.

Para desconectar um usuário, chame signOut: .

Rápido

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

Objetivo-C

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

Você também pode adicionar código de tratamento de erros para toda a gama de erros de autenticação. Consulte Tratamento de erros .