Ir para o console

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 Auth.
    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 Firebaseimport GoogleSignIn

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

import Firebaseimport 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 ao ID do cliente na ordem inversa. 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: [UIApplication.OpenURLOptionsKey : Any])
      -> Bool {    return GIDSignIn.sharedInstance().handle(url,
                                sourceApplication:options[UIApplication.OpenURLOptionsKey.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 seus apps, é possível acessar as 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. 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.