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.
- No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
- Quando solicitado, adicione o repositório SDK das plataformas Apple do Firebase:
- Escolha a biblioteca Firebase Authentication.
- Adicione o sinalizador
-ObjC
à seção Outros sinalizadores de vinculador das configurações de compilação do seu destino. - Quando terminar, o Xcode começará automaticamente a resolver e baixar suas dependências em segundo plano.
https://github.com/firebase/firebase-ios-sdk.git
Adicione o SDK de login do Google ao seu projeto
No Xcode, com o projeto do seu aplicativo aberto, navegue até File > Add Packages .
Quando solicitado, adicione o repositório do SDK de login do Google:
https://github.com/google/GoogleSignIn-iOS
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:
- No console do Firebase , abra a seção Autenticação .
- Na guia Método de login , habilite o provedor Google .
Clique em Salvar .
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.
- Adicione esquemas de URL personalizados ao seu projeto Xcode:
- 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 .
- 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
e procure a chaveGoogleService-Info.plist 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):
- No
application:didFinishLaunchingWithOptions:
do delegado do seu aplicativo, configure o objetoFirebaseApp
.Rápido
FirebaseApp.configure()
Objetivo-C
// Use Firebase library to configure APIs [FIRApp configure];
- Implemente o
application:openURL:options:
do delegado do seu aplicativo. O método deve chamar o métodohandleURL
da instânciaGIDSignIn
, 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]; }
- 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 { // ... } }];
- 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 comoGIDSignInButton
. - Opcional : se quiser personalizar o botão, faça o seguinte:
Rápido
- No seu controlador de visualização, declare o botão de login como uma propriedade.
@IBOutlet weak var signInButton: GIDSignInButton!
- Conecte o botão à propriedade
signInButton
que você acabou de declarar. - Personalize o botão definindo as propriedades do objeto GIDSignInButton .
Objetivo-C
- 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;
- Conecte o botão à propriedade
signInButton
que você acabou de declarar. - Personalize o botão definindo as propriedades do objeto GIDSignInButton .
- No seu controlador de visualização, declare o botão de login como uma propriedade.
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 .