Uwierzytelniaj przez Microsoft na Androidzie

Aby umożliwić użytkownikom uwierzytelnianie w Firebase za pomocą dostawców protokołu OAuth, takich jak Microsoft Azure Active Directory, możesz zintegrować z aplikacją ogólne internetowe logowanie OAuth przy użyciu pakietu SDK Firebase w celu przeprowadzenia kompleksowego procesu logowania.

Zanim zaczniesz

Aby logować użytkowników przy użyciu kont Microsoft (Azure Active Directory i osobistych kont Microsoft), musisz najpierw włączyć Microsoft jako dostawcę logowania w projekcie Firebase:

  1. Dodaj Firebase do swojego projektu na Androida.

  2. W konsoli Firebase otwórz sekcję Uwierzytelnianie.
  3. Na karcie Metoda logowania włącz dostawcę Microsoft.
  4. Dodaj Client ID (Identyfikator klienta) i Client Secret (Tajny klucz klienta) z konsoli programisty tego dostawcy do konfiguracji dostawcy:
    1. Aby zarejestrować klienta Microsoft OAuth, postępuj zgodnie z instrukcjami zawartymi w artykule Krótkie wprowadzenie: rejestrowanie aplikacji w punkcie końcowym Azure Active Directory w wersji 2.0. Pamiętaj, że ten punkt końcowy obsługuje logowanie się przy użyciu kont osobistych Microsoft oraz kont Azure Active Directory. Dowiedz się więcej o Azure Active Directory w wersji 2.0.
    2. Rejestrując aplikacje u tych dostawców, pamiętaj, aby zarejestrować domenę *.firebaseapp.com dla Twojego projektu jako domenę przekierowującą aplikacji.
  5. Kliknij Zapisz.
  6. Jeśli nie masz jeszcze ustawionego odcisku cyfrowego SHA-1 swojej aplikacji, możesz to zrobić na stronie ustawień w konsoli Firebase. Szczegółowe informacje o pobieraniu odcisku cyfrowego SHA-1 aplikacji znajdziesz w artykule Uwierzytelnianie klienta.

Zarejestruj się za pomocą pakietu SDK Firebase

Jeśli tworzysz aplikację na Androida, najprostszym sposobem uwierzytelniania użytkowników Firebase za pomocą ich kont Microsoft jest obsługa całego procesu logowania za pomocą pakietu SDK Firebase na Androida.

Aby zalogować się za pomocą pakietu SDK Firebase na Androida, wykonaj te czynności:

  1. Utwórz instancję dostawcy OAuthProvider za pomocą jego elementu Builder o identyfikatorze dostawcy microsoft.com.

    Kotlin+KTX

    val provider = OAuthProvider.newBuilder("microsoft.com")

    Java

    OAuthProvider.Builder provider = OAuthProvider.newBuilder("microsoft.com");

  2. Opcjonalnie: określ dodatkowe niestandardowe parametry OAuth, które chcesz wysyłać z żądaniem OAuth.

    Kotlin+KTX

    // 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 protokołu Microsoft OAuth. Pamiętaj, że za pomocą setCustomParameters() nie możesz przekazywać parametrów wymaganych przez Firebase. Są to: client_id, response_type, redirect_uri, state, scope i response_mode.

    Aby zezwolić na logowanie się do aplikacji tylko użytkownikom określonego najemcy Azure AD, można użyć przyjaznej nazwy domeny najemcy Azure AD lub identyfikatora GUID najemcy. Można to zrobić, określając pole „najemca” w obiekcie parametrów niestandardowych.

    Kotlin+KTX

    // 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");

  3. Opcjonalnie: określ dodatkowe zakresy OAuth 2.0 poza podstawowym profilem, o które chcesz poprosić dostawcę uwierzytelniania.

    Kotlin+KTX

    // 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 dotyczącej uprawnień i zgody firmy Microsoft.

  4. Uwierzytelniaj w Firebase za pomocą obiektu dostawcy OAuth. Pamiętaj, że w przeciwieństwie do innych działań FirebaseAuth będziesz mieć kontrolę nad interfejsem użytkownika, ponieważ wyświetli się niestandardowa karta Chrome. Dlatego nie odwołuj się do aktywności w załącznikach OnSuccessListener i OnFailureListener, ponieważ zostaną one odłączone od razu po uruchomieniu operacji.

    Najpierw sprawdź, czy nie wysłaliśmy Ci już odpowiedzi. Zalogowanie się za pomocą tej metody powoduje, że Twoja aktywność trafia w tle, co oznacza, że system może ją odzyskać podczas logowania. Aby mieć pewność, że użytkownik nie będzie próbował ponownie go znaleźć, sprawdź, czy nie pojawił się już jakiś wynik.

    Aby sprawdzić, czy jest jakiś oczekujący wynik, zadzwoń pod numer getPendingAuthResult:

    Kotlin+KTX

    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ąć procedurę logowania, zadzwoń pod numer startActivityForSignInWithProvider:

    Kotlin+KTX

    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 ukończeniu konfiguracji token dostępu OAuth powiązany z dostawcą można pobrać ze zwróconego obiektu OAuthCredential.

    Za pomocą tokena dostępu OAuth możesz wywoływać interfejs Microsoft Graph API.

    W przeciwieństwie do innych dostawców obsługiwanych przez Uwierzytelnianie Firebase Microsoft nie podaje adresu URL zdjęcia. Zamiast tego dane binarne zdjęcia profilowego należy wysyłać za pomocą interfejsu Microsoft Graph API.

    Oprócz tokena dostępu OAuth z obiektu OAuthCredential można też pobrać token identyfikatora OAuth użytkownika. Deklaracja sub w tokenie identyfikatora odnosi się do aplikacji i nie będzie odpowiadać identyfikatorowi sfederowanego użytkownika używanego przez Uwierzytelnienie Firebase i dostępnego przez user.getProviderData().get(0).getUid(). Należy zamiast niego użyć pola deklaracji oid. W przypadku logowania się przy użyciu najemcy Azure AD, żądanie oid jest identyczne. W przypadku nienajemców pole oid jest jednak dopełnione. W przypadku sfederowanego identyfikatora 4b2eabcdefghijkl obiekt oid będzie miał formularz 00000000-0000-0000-4b2e-abcdefghijkl.

  5. Powyższe przykłady dotyczą procesów logowania, ale masz też możliwość połączenia dostawcy Microsoft z istniejącym użytkownikiem za pomocą startActivityForLinkWithProvider. Możesz na przykład połączyć kilku dostawców z tym samym użytkownikiem, umożliwiając im logowanie się za pomocą dowolnej z tych usług.

    Kotlin+KTX

    // 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.
                        }
                    });

  6. Tego samego wzorca można używać z funkcją startActivityForReauthenticateWithProvider, która umożliwia pobieranie nowych danych logowania w przypadku poufnych operacji wymagających niedawnego logowania.

    Kotlin+KTX

    // 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 loguje się po raz pierwszy, tworzone jest nowe konto użytkownika, które jest łączone z danymi logowania (nazwa użytkownika i hasło, numer telefonu lub informacje o dostawcy uwierzytelniania). Nowe konto jest przechowywane w ramach Twojego projektu Firebase i może być używane do identyfikowania użytkowników we wszystkich aplikacjach w Twoim projekcie niezależnie od tego, jak się on loguje.

  • W swoich aplikacjach możesz uzyskać podstawowe informacje o profilu użytkownika z obiektu FirebaseUser. Patrz: Zarządzanie użytkownikami.

  • W regułach zabezpieczeń Bazy danych czasu rzeczywistego Firebase i Cloud Storage możesz pobrać ze zmiennej auth unikalny identyfikator użytkownika zalogowanego użytkownika i użyć go do kontrolowania, do jakich danych użytkownik ma dostęp.

Możesz zezwolić użytkownikom na logowanie się w aplikacji przy użyciu różnych dostawców uwierzytelniania, łącząc dane logowania dostawcy uwierzytelniania z istniejącym kontem użytkownika.

Aby wylogować użytkownika, wywołaj signOut:

Kotlin+KTX

Firebase.auth.signOut()

Java

FirebaseAuth.getInstance().signOut();