Możesz umożliwić użytkownikom uwierzytelnianie się w Firebase za pomocą dostawców OAuth, takich jak Microsoft Azure Active Directory, integrując ogólne logowanie OAuth oparte na internecie z aplikacją za pomocą pakietu SDK Firebase, aby przeprowadzić cały proces logowania.
Zanim zaczniesz
Aby logować użytkowników za pomocą kont Microsoft (Azure Active Directory i osobistych kont Microsoft), musisz najpierw włączyć Microsoft jako dostawcę logowania w projekcie w Firebase:
- W konsoli Firebase otwórz Zabezpieczenia > Uwierzytelnianie.
- Na karcie Metoda logowania włącz dostawcę logowania Microsoft.
-
Dodaj identyfikator klienta i tajny klucz klienta z konsoli dewelopera tego dostawcy do konfiguracji dostawcy:
- Aby zarejestrować klienta Microsoft OAuth, postępuj zgodnie z instrukcjami w przewodniku Szybki start: rejestrowanie aplikacji w punkcie końcowym Azure Active Directory w wersji 2.0. Pamiętaj, że ten punkt końcowy obsługuje logowanie za pomocą osobistych kont Microsoft oraz kont Azure Active Directory. Więcej informacji o Azure Active Directory w wersji 2.0.
-
Rejestrując aplikacje u tych dostawców, zarejestruj domenę
*.firebaseapp.comdla swojego projektu jako domenę przekierowania dla aplikacji.
- Kliknij Zapisz.
Jeśli jeszcze tego nie zrobisz, określ odcisk cyfrowy SHA-1 aplikacji.
W konsoli Firebase otwórz ustawienia
Ustawienia > Ogólne tab.Przewiń w dół do karty Twoje aplikacje , wybierz aplikację na Androida i dodaj odcisk cyfrowy SHA-1 w polu Odciski cyfrowe certyfikatu SHA.
Szczegółowe informacje o tym, jak uzyskać odcisk cyfrowy SHA aplikacji, znajdziesz w artykule Uwierzytelnianie klienta.
Obsługa procesu logowania za pomocą pakietu SDK Firebase
Jeśli tworzysz aplikację na Androida, najłatwiejszym sposobem uwierzytelniania użytkowników w Firebase za pomocą ich kont Microsoft jest obsługa całego procesu logowania za pomocą pakietu SDK Firebase na Androida.
Aby obsługiwać proces logowania za pomocą pakietu SDK Firebase na Androida, wykonaj te czynności:
Utwórz instancję OAuthProvider za pomocą jej Buildera z identyfikatorem dostawcy microsoft.com.
Kotlin
val provider = OAuthProvider.newBuilder("microsoft.com")
Java
OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");
Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz wysłać z żądaniem OAuth.
Kotlin
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent") // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com")
Java
// Target specific email with login hint. // Force re-consent. provider.addCustomParameter("prompt", "consent"); // Target specific email with login hint. provider.addCustomParameter("login_hint", "user@firstadd.onmicrosoft.com");
Parametry obsługiwane przez Microsoft znajdziesz w dokumentacji Microsoft OAuth. Pamiętaj, że nie możesz przekazywać parametrów wymaganych przez Firebase za pomocą
setCustomParameters(). Są to parametry client_id, response_type, redirect_uri, state, scope i response_mode.Aby zezwolić na logowanie się w aplikacji tylko użytkownikom z określonej dzierżawy Azure AD, możesz użyć przyjaznej nazwy domeny dzierżawy Azure AD lub identyfikatora GUID dzierżawy. Możesz to zrobić, określając pole „tenant” w obiekcie parametrów niestandardowych.
Kotlin
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". provider.addCustomParameter("tenant", "TENANT_ID")
Java
// Optional "tenant" parameter in case you are using an Azure AD tenant. // eg. '8eaef023-2b34-4da1-9baa-8bc8c9d6a490' or 'contoso.onmicrosoft.com' // or "common" for tenant-independent tokens. // The default value is "common". provider.addCustomParameter("tenant", "TENANT_ID");
Opcjonalnie: określ dodatkowe zakresy protokołu OAuth 2.0 poza podstawowym profilem, o które chcesz poprosić dostawcę uwierzytelniania.
Kotlin
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. provider.scopes = listOf("mail.read", "calendars.read")
Java
// Request read access to a user's email addresses. // This must be preconfigured in the app's API permissions. List<String> scopes = new ArrayList<String>() { { add("mail.read"); add("calendars.read"); } }; provider.setScopes(scopes);
Więcej informacji znajdziesz w dokumentacji Microsoft dotyczącej uprawnień i zgody.
Uwierzytelnij się w Firebase za pomocą obiektu dostawcy OAuth. Pamiętaj, że w przeciwieństwie do innych operacji FirebaseAuth ta operacja przejmie kontrolę nad interfejsem użytkownika, wyświetlając niestandardową kartę Chrome. W związku z tym nie odwołuj się do swojej aktywności w elementach
OnSuccessListeneriOnFailureListener, które dołączasz, ponieważ zostaną one natychmiast odłączone, gdy operacja uruchomi interfejs użytkownika.Najpierw sprawdź, czy masz już odpowiedź. Logowanie się za pomocą tej metody powoduje umieszczenie aktywności w tle, co oznacza, że może ona zostać odzyskana przez system podczas procesu logowania. Aby uniknąć sytuacji, w której użytkownik musi ponownie spróbować, sprawdź, czy wynik jest już dostępny.
Aby sprawdzić, czy jest oczekujący wynik, wywołaj funkcję
getPendingAuthResult:Kotlin
val pendingResultTask = firebaseAuth.pendingAuthResult if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. } } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Java
Task<AuthResult> pendingResultTask = firebaseAuth.getPendingAuthResult(); if (pendingResultTask != null) { // There's something already here! Finish the sign-in for your user. pendingResultTask .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } }); } else { // There's no pending result so you need to start the sign-in flow. // See below. }
Aby rozpocząć proces logowania, wywołaj funkcję
startActivityForSignInWithProvider:Kotlin
firebaseAuth .startActivityForSignInWithProvider(activity, provider.build()) .addOnSuccessListener { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } .addOnFailureListener { // Handle failure. }
Java
firebaseAuth .startActivityForSignInWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is signed in. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // ((OAuthCredential)authResult.getCredential()).getAccessToken(). // The OAuth secret can be retrieved by calling: // ((OAuthCredential)authResult.getCredential()).getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Po pomyślnym zakończeniu token dostępu protokołu OAuth powiązany z dostawcą można pobrać z zwróconego obiektu
OAuthCredential.Za pomocą tokena dostępu OAuth możesz wywołać interfejs Microsoft Graph API.
W przeciwieństwie do innych dostawców obsługiwanych przez Uwierzytelnianie Firebase Microsoft nie udostępnia adresu URL zdjęcia. Zamiast tego dane binarne zdjęcia profilowego należy pobrać za pomocą interfejsu Microsoft Graph API.
Oprócz tokena dostępu OAuth z obiektu
OAuthCredentialmożna też pobrać token identyfikatora OAuth użytkownika. Deklaracjasubw tokenie identyfikatora jest specyficzna dla aplikacji i nie będzie zgodna z identyfikatorem użytkownika sfederowanego używanym przez Uwierzytelnianie Firebase, który jest dostępny za pomocąuser.getProviderData().get(0).getUid(). Zamiast tego należy użyć pola deklaracjioid. W przypadku logowania się za pomocą dzierżawy Azure AD deklaracjaoidbędzie dokładnie pasować. W przypadku braku dzierżawy poleoidjest jednak dopełniane. W przypadku identyfikatora sfederowanego4b2eabcdefghijklpoleoidbędzie mieć postać00000000-0000-0000-4b2e-abcdefghijkl.Powyższe przykłady dotyczą procesów logowania, ale możesz też połączyć dostawcę Microsoft z istniejącym użytkownikiem za pomocą funkcji
startActivityForLinkWithProvider. Możesz na przykład połączyć wielu dostawców z tym samym użytkownikiem, aby mógł się on logować za pomocą dowolnego z nich.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForLinkWithProvider(activity, provider.build()) .addOnSuccessListener { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForLinkWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // Provider credential is linked to the current user. // IdP data available in // authResult.getAdditionalUserInfo().getProfile(). // The OAuth access token can also be retrieved: // authResult.getCredential().getAccessToken(). // The OAuth secret can be retrieved by calling: // authResult.getCredential().getSecret(). } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Tego samego wzorca można używać z funkcją
startActivityForReauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania do operacji wrażliwych wymagających niedawnego logowania.Kotlin
// The user is already signed-in. val firebaseUser = firebaseAuth.currentUser!! firebaseUser .startActivityForReauthenticateWithProvider(activity, provider.build()) .addOnSuccessListener { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } .addOnFailureListener { // Handle failure. }
Java
// The user is already signed-in. FirebaseUser firebaseUser = firebaseAuth.getCurrentUser(); firebaseUser .startActivityForReauthenticateWithProvider(/* activity= */ this, provider.build()) .addOnSuccessListener( new OnSuccessListener<AuthResult>() { @Override public void onSuccess(AuthResult authResult) { // User is re-authenticated with fresh tokens and // should be able to perform sensitive operations // like account deletion and email or password // update. } }) .addOnFailureListener( new OnFailureListener() { @Override public void onFailure(@NonNull Exception e) { // Handle failure. } });
Dalsze kroki
Gdy użytkownik zaloguje się po raz pierwszy, zostanie utworzone nowe konto użytkownika i połączone z danymi logowania, czyli nazwą użytkownika i hasłem, numerem telefonu lub informacjami o dostawcy uwierzytelniania, za pomocą których użytkownik się zalogował. To nowe konto jest przechowywane w projekcie w Firebase i może służyć do identyfikowania użytkownika w każdej aplikacji w projekcie, niezależnie od sposobu logowania.
-
W aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu
FirebaseUser. Zobacz Zarządzanie użytkownikami. W regułach bezpieczeństwa Firebase Realtime Database i Cloud Storage Bazy danych czasu rzeczywistego Firebase i Cloud Storage, możesz uzyskać unikalny identyfikator zalogowanego użytkownika z zmiennej
auth, i użyć go do kontrolowania, do jakich danych użytkownik może mieć dostęp.
Możesz zezwolić użytkownikom na logowanie się w aplikacji za pomocą wielu dostawców uwierzytelniania przez połączenie danych logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.
Aby wylogować użytkownika, wywołaj funkcję
signOut:
Kotlin
Firebase.auth.signOut()
Java
FirebaseAuth.getInstance().signOut();