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:
Use o Swift Package Manager para instalar e gerenciar as dependências do Firebase.
- No Xcode, com seu projeto de aplicativo aberto, navegue até Arquivo > Adicionar pacotes.
- Quando solicitado, adicione o repositório do SDK do Firebase para as plataformas da Apple:
- Escolha a biblioteca do Firebase Authentication.
- Quando terminar, o Xcode começará a resolver e fazer o download das dependências em segundo plano automaticamente.
https://github.com/firebase/firebase-ios-sdk
Agora execute algumas etapas de configuração:
- No Console do Firebase, abra a seção Autenticação.
- Na guia Método de login, ative o provedor GitHub.
- Adicione o ID do cliente e a chave secreta do cliente do console de desenvolvimento do provedor à
configuração correspondente:
- 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.
- Em seguida, verifique se o URI de redirecionamento do OAuth do Firebase (por exemplo,
my-app-12345.firebaseapp.com/__/auth/handler
), está definido como o URL de retorno de chamada de autorização na página de configurações do app no GitHub (em inglês).
- Clique em Salvar.
Processe o fluxo de login com o SDK do Firebase
Para processar o fluxo de login com o SDK do Firebase para plataformas Apple, siga estas etapas:
Adicione esquemas de URL personalizado ao seu projeto do Xcode:
- 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.
- Clique no botão + e adicione um esquema de URL ao ID do cliente invertido. Para encontrar esse valor, abra o arquivo de configuração
e procure a chaveGoogleService-Info.plist 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:
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"];
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.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, será preciso solicitar autorização para acessá-las em Permissões de APIs, no console do desenvolvedor 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).
Opcional: se quiser personalizar a forma como o app apresenta o
SFSafariViewController
ou oUIWebView
ao exibir o reCAPTCHA para o usuário, crie uma classe personalizada que esteja em conformidade com o protocoloFIRAuthUIDelegate
e transmita-a paragetCredentialWithUIDelegate:completion:
.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. guard let oauthCredential = authResult.credential as? OAuthCredential else { return } // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.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. FIROAuthCredential *oauthCredential = (FIROAuthCredential *)authResult.credential; // GitHub OAuth access token can also be retrieved by: // oauthCredential.accessToken // GitHub OAuth ID token can be retrieved by calling: // oauthCredential.idToken }]; } }];
Com o token de acesso OAuth, é possível chamar a API GitHub (em inglês).
Por exemplo, para receber informações básicas de perfil, chame a API REST transmitindo o token de acesso no cabeçalho
Authorization
:https://api.github.com/user
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 }];
É 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 }];
Próximas etapas
Depois que um usuário faz login pela primeira vez, uma nova conta de usuário é 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.
-
É possível receber as informações básicas de perfil do usuário do objeto
FIRUser
nos seus apps. Consulte Gerenciar usuários. Nas Regras de segurança do Firebase Realtime Database e do Cloud Storage, é possível receber o ID do usuário único conectado da variável
auth
e usar esse ID para controlar quais dados um usuário 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.