Autenticar usando o Login do Google no iOS

Integrando o Login do Google ao seu app, você pode permitir a autenticação de usuários no Firebase com Contas do Google.

Antes de começar

  1. Adicione o Firebase ao projeto do iOS. Inclua os pods a seguir no Podfile:
    pod 'Firebase/Auth'
    pod 'GoogleSignIn'
    
  2. Se você ainda não conectou o app ao projeto do Firebase, faça isso no Console do Firebase.
  3. Ative o Login do Google no Console do Firebase:
    1. No Console do Firebase, abra a seção Authentication.
    2. Na guia Método de login, ative o método de login do Google e clique em Salvar.

1. Importe os arquivos de cabeçalho necessários

Primeiro, você precisa importar os arquivos de cabeçalho dos SDKs do Firebase e do Login do Google para o app.

Swift

No representante do seu app, importe estes arquivos de cabeçalho:

import Firebase
import GoogleSignIn

No controlador de visualização da exibição de login, importe estes arquivos de cabeçalho:

import Firebase
import GoogleSignIn

Objective-C

No representante do seu app, importe estes arquivos de cabeçalho:

@import Firebase;
@import GoogleSignIn;

No controlador de visualização da exibição de login, importe estes arquivos de cabeçalho:

@import Firebase;
@import GoogleSignIn;

2. Implementar o Login do Google

Para implementar o Login do Google, siga estas etapas. Consulte detalhes sobre como usar o Login do Google no iOS na documentação do Login do Google para desenvolvedores.

  1. Adicione esquemas de URL personalizado ao seu projeto do XCode:
    1. Abra a configuração do seu projeto: clique 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 para o código do cliente reverso. 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 ao mostrado a seguir, mas com os valores específicos do seu app:

  2. Declare que o representante do app implementa o protocolo GIDSignInDelegate.

    Swift

    Em AppDelegate.swift:
    class AppDelegate: UIResponder, UIApplicationDelegate, GIDSignInDelegate {
    

    Objective-C

    Em AppDelegate.h:
    @interface AppDelegate : UIResponder<UIApplicationDelegate, GIDSignInDelegate>
    
  3. No método application:didFinishLaunchingWithOptions: do representante do seu app, configure o objeto FirebaseApp e defina o representante de login.

    Swift

    // Use Firebase library to configure APIs
    FirebaseApp.configure()
    
    GIDSignIn.sharedInstance().clientID = FirebaseApp.app()?.options.clientID
    GIDSignIn.sharedInstance().delegate = self
    

    Objective-C

    // Use Firebase library to configure APIs
    [FIRApp configure];
    
    [GIDSignIn sharedInstance].clientID = [FIRApp defaultApp].options.clientID;
    [GIDSignIn sharedInstance].delegate = self;
    
  4. Implemente o método application:openURL:options: do representante do seu app. Esse método chama o método handleURL da instância GIDSignIn que tratará corretamente o URL recebido pelo app no final do processo de autenticação.

    Swift

    @available(iOS 9.0, *)
    func application(_ application: UIApplication, open url: URL, options: [UIApplicationOpenURLOptionsKey : Any])
      -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                sourceApplication:options[UIApplicationOpenURLOptionsKey.sourceApplication] as? String,
                                annotation: [:])
    }
    

    Objective-C

    - (BOOL)application:(nonnull UIApplication *)application
                openURL:(nonnull NSURL *)url
                options:(nonnull NSDictionary<NSString *, id> *)options {
      return [[GIDSignIn sharedInstance] handleURL:url
             sourceApplication:options[UIApplicationOpenURLOptionsSourceApplicationKey]
                    annotation:options[UIApplicationOpenURLOptionsAnnotationKey]];
    }
    

    Para que seu app funcione no iOS 8 ou anterior, implemente também o método obsoleto application:openURL:sourceApplication:annotation:.

    Swift

    func application(_ application: UIApplication, open url: URL, sourceApplication: String?, annotation: Any) -> Bool {
        return GIDSignIn.sharedInstance().handle(url,
                                                 sourceApplication: sourceApplication,
                                                 annotation: annotation)
    }
    

    Objective-C

    - (BOOL)application:(UIApplication *)application
                openURL:(NSURL *)url
      sourceApplication:(NSString *)sourceApplication
             annotation:(id)annotation {
      return [[GIDSignIn sharedInstance] handleURL:url
                                 sourceApplication:sourceApplication
                                        annotation:annotation];
    }
    
  5. No representante do app, implemente o protocolo GIDSignInDelegate para tratar do processo de login ao definir estes métodos:

    Objective-C

    - (void)signIn:(GIDSignIn *)signIn
    didSignInForUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // ...
      if (error == nil) {
        GIDAuthentication *authentication = user.authentication;
        FIRAuthCredential *credential =
        [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                         accessToken:authentication.accessToken];
        // ...
      } else {
        // ...
      }
    }
    
    - (void)signIn:(GIDSignIn *)signIn
    didDisconnectWithUser:(GIDGoogleUser *)user
         withError:(NSError *)error {
      // Perform any operations when the user disconnects from app here.
      // ...
    }
    

    Swift

    func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
      // ...
      if let error = error {
        // ...
        return
      }
    
      guard let authentication = user.authentication else { return }
      let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                        accessToken: authentication.accessToken)
      // ...
    }
    
    func sign(_ signIn: GIDSignIn!, didDisconnectWith user: GIDGoogleUser!, withError error: Error!) {
        // Perform any operations when the user disconnects from app here.
        // ...
    }
    
  6. Declare que o controlador de visualização de login do app implementa o protocolo GIDSignInUIDelegate.

    Swift

    No controlador de visualização:

    class MainViewController: UITableViewController, GIDSignInUIDelegate {
    

    Objective-C

    No arquivo de cabeçalho do controlador de visualização:

    @interface MainViewController : UITableViewController<GIDSignInUIDelegate>
    
  7. No controlador de visualização, modifique o método viewDidLoad para definir o representante de IU do objeto GIDSignIn e, como opção, para fazer o login silenciosamente quando possível.

    Objective-C

    - (void)viewDidLoad {
      [super viewDidLoad];
    
    [GIDSignIn sharedInstance].uiDelegate = self;
    [[GIDSignIn sharedInstance] signIn];
    
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    

    Swift

    override func viewDidLoad() {
      super.viewDidLoad()
    
    GIDSignIn.sharedInstance().uiDelegate = self
    GIDSignIn.sharedInstance().signIn()
    
      // TODO(developer) Configure the sign-in button look/feel
      // ...
    }
    
  8. Adicione um GIDSignInButton ao seu storyboard, arquivo XIB ou instancie-o de maneira programática. Para adicionar o botão ao seu storyboard ou arquivo XIB, inclua uma visualização e defina sua classe personalizada como GIDSignInButton.
  9. Opcional: se você quiser personalizar o botão, siga estas etapas:

    Swift

    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 ao definir as propriedades do objeto GIDSignInButton.

    Objective-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 ao definir as propriedades do objeto GIDSignInButton.

3. Autenticar com o Firebase

No método signIn:didSignInForUser:withError:, receba os tokens de código e de acesso do Google do objeto GIDAuthentication e troque-os por uma credencial do Firebase:

Swift

func sign(_ signIn: GIDSignIn!, didSignInFor user: GIDGoogleUser!, withError error: Error?) {
  // ...
  if let error = error {
    // ...
    return
  }

  guard let authentication = user.authentication else { return }
  let credential = GoogleAuthProvider.credential(withIDToken: authentication.idToken,
                                                    accessToken: authentication.accessToken)
  // ...
}

Objective-C

- (void)signIn:(GIDSignIn *)signIn
didSignInForUser:(GIDGoogleUser *)user
     withError:(NSError *)error {
  // ...
  if (error == nil) {
    GIDAuthentication *authentication = user.authentication;
    FIRAuthCredential *credential =
    [FIRGoogleAuthProvider credentialWithIDToken:authentication.idToken
                                     accessToken:authentication.accessToken];
    // ...
  } else {
    // ...
  }
}

Por fim, use a credencial para se autenticar no Firebase:

Swift

Auth.auth().signInAndRetrieveData(with: credential) { (authResult, error) in
  if let error = error {
    // ...
    return
  }
  // User is signed in
  // ...
}

Objective-C

[[FIRAuth auth] signInAndRetrieveDataWithCredential:credential
                                         completion:^(FIRAuthDataResult * _Nullable authResult,
                                                      NSError * _Nullable error) {
  if (error) {
    // ...
    return;
  }
  // User successfully signed in. Get user data from the FIRUser object
  if (authResult == nil) { return; }
  FIRUser *user = authResult.user;
  // ...
}];

Próximas etapas

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. Ela pode ser usada para identificar um usuário em todos os apps do projeto, independentemente do método de login usado.

  • Nos apps, é possível acessar informações básicas de perfil do usuário a partir do objeto FIRUser. 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. Use essa informação para controlar quais dados ele 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:.

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.

Enviar comentários sobre…

Precisa de ajuda? Acesse nossa página de suporte.