Rychlý start: Přihlášení uživatelů a volání rozhraní Microsoft Graph API z aplikace pro Android

Vítejte! Pravděpodobně to není stránka, kterou jste očekávali. Momentálně pracujeme na opravě, ale prozatím použijte následující odkaz– měli byste přejít na správný článek:

Rychlý start: Přihlášení uživatelů a volání Microsoft Graphu z aplikace pro Android

Omlouváme se za nepříjemnosti a vážíme si vaší trpělivosti, zatímco pracujeme na vyřešení tohoto problému.

V tomto rychlém startu stáhnete a spustíte ukázku kódu, která předvádí, jak se aplikace pro Android může přihlásit uživatele a získat přístupový token pro volání rozhraní Microsoft Graph API.

Podívejte se, jak ukázka funguje pro ilustraci.

Aplikace musí být reprezentovány objektem aplikace v Microsoft Entra ID, aby platforma Microsoft Identity Platform mohla vaší aplikaci poskytovat tokeny.

Požadavky

Krok 1: Konfigurace aplikace na webu Azure Portal

Aby ukázka kódu v tomto rychlém startu fungovala, přidejte identifikátor URI přesměrování kompatibilní s zprostředkovatelem ověřování.

Already configured Vaše aplikace je nakonfigurovaná s těmito atributy.

Krok 2: Stažení projektu

Spusťte projekt pomocí Android Studia.

Krok 3: Aplikace je nakonfigurovaná a připravená ke spuštění

Nakonfigurovali jsme váš projekt s hodnotami vlastností vaší aplikace a je připravený ke spuštění. Ukázková aplikace se spustí na obrazovce Režimu jednoho účtu. Ve výchozím nastavení je k dispozici výchozí obor user.read, který se používá při čtení vlastních dat profilu během volání rozhraní Microsoft Graph API. Ve výchozím nastavení je k dispozici adresa URL pro volání rozhraní Microsoft Graph API. Pokud chcete, můžete obě tyto možnosti změnit.

MSAL sample app showing single and multiple account usage

Pomocí nabídky aplikace můžete změnit režimy jednoho a více účtů.

V režimu jednoho účtu se přihlaste pomocí pracovního nebo domácího účtu:

  1. Výběrem možnosti Získat data grafu interaktivně vyzvete uživatele k zadání přihlašovacích údajů. V dolní části obrazovky se zobrazí výstup volání rozhraní Microsoft Graph API.
  2. Po přihlášení vyberte Získat data grafu bezobslužně , aby se volání rozhraní Microsoft Graph API bez výzvy uživatele k zadání přihlašovacích údajů znovu zobrazilo. V dolní části obrazovky se zobrazí výstup volání rozhraní Microsoft Graph API.

V režimu více účtů můžete stejný postup zopakovat. Kromě toho můžete odebrat přihlášený účet, který také odebere tokeny uložené v mezipaměti pro tento účet.

Poznámka:

Enter_the_Supported_Account_Info_Here

Jak ukázka funguje

Screenshot of the sample app

Kód je uspořádaný do fragmentů, které ukazují, jak napsat jednu a více účtů aplikace MSAL. Soubory kódu jsou uspořádány takto:

Soubor Demonstruje
MainActivity Spravuje uživatelské rozhraní.
MSGraphRequestWrapper Volá rozhraní Microsoft Graph API pomocí tokenu poskytovaného knihovnou MSAL.
MultipleAccountModeFragment Inicializuje aplikaci s více účty, načte uživatelský účet a získá token pro volání rozhraní Microsoft Graph API.
SingleAccountModeFragment Inicializuje aplikaci s jedním účtem, načte uživatelský účet a získá token pro volání rozhraní Microsoft Graph API.
res/auth_config_multiple_account.json Konfigurační soubor s více účty
res/auth_config_single_account.json Konfigurační soubor s jedním účtem
Gradle Scripts/build.grade (Module:app) Tady jsou přidány závislosti knihovny MSAL.

Teď se na tyto soubory podíváme podrobněji a v každém z nich označíme kód specifický pro MSAL.

Přidání KNIHOVNY MSAL do aplikace

MSAL (com.microsoft.identity.client) je knihovna, která slouží k přihlašování uživatelů a vyžádání tokenů používaných pro přístup k rozhraní API chráněnému platformou Microsoft Identity Platform. Gradle 3.0+ nainstaluje knihovnu při přidání následujícího příkazu do gradle Scripts>build.gradle (modul: aplikace) v části Závislosti:

dependencies {
    ...
    implementation 'com.microsoft.identity.client:msal:2.+'
    ...
}

To dává Gradle pokyn ke stažení a sestavení MSAL z mavenu central.

Musíte také přidat odkazy na maven do části úložiště allprojects>build.gradle (module: aplikace), například takto:

allprojects {
    repositories {
        mavenCentral()
        google()
        mavenLocal()
        maven {
            url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
        }
        maven {
            name "vsts-maven-adal-android"
            url "https://identitydivision.pkgs.visualstudio.com/_packaging/AndroidADAL/maven/v1"
            credentials {
                username System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_USERNAME") : project.findProperty("vstsUsername")
                password System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") != null ? System.getenv("ENV_VSTS_MVN_ANDROIDADAL_ACCESSTOKEN") : project.findProperty("vstsMavenAccessToken")
            }
        }
        jcenter()
    }
}

Importy MSAL

Importy, které jsou relevantní pro knihovnu MSAL, jsou com.microsoft.identity.client.*. Uvidíte import > com.microsoft.identity.client.PublicClientApplication; například, který obor názvů třídy PublicClientApplication představuje vaši veřejnou klientskou aplikaci.

SingleAccountModeFragment.java

Tento soubor ukazuje, jak vytvořit jednu aplikaci MSAL účtu a volat rozhraní Microsoft Graph API.

Jednoúčelové aplikace používají jenom jeden uživatel. Můžete mít například jenom jeden účet, pomocí kterého se přihlašujete k mapovací aplikaci.

Inicializace MSAL s jedním účtem

V auth_config_single_account.jsonsouboru se onCreateView()vytvoří jeden účet PublicClientApplication pomocí konfiguračních informací uložených auth_config_single_account.json v souboru. Takto inicializujete knihovnu MSAL pro použití v aplikaci MSAL s jedním účtem:

...
// Creates a PublicClientApplication object with res/raw/auth_config_single_account.json
PublicClientApplication.createSingleAccountPublicClientApplication(getContext(),
        R.raw.auth_config_single_account,
        new IPublicClientApplication.ISingleAccountApplicationCreatedListener() {
            @Override
            public void onCreated(ISingleAccountPublicClientApplication application) {
                /**
                 * This test app assumes that the app is only going to support one account.
                 * This requires "account_mode" : "SINGLE" in the config json file.
                 **/
                mSingleAccountApp = application;
                loadAccount();
            }

            @Override
            public void onError(MsalException exception) {
                displayError(exception);
            }
        });

Přihlášení uživatele

V SingleAccountModeFragment.javakódu pro přihlášení uživatele je v initializeUI()obslužné rutině signInButton kliknutí.

Před pokusem o získání tokenů zavolejte signIn() . signIn() chová se, jako by acquireToken() byl volána, což vede k interaktivní výzvě, aby se uživatel přihlásil.

Přihlášení uživatele je asynchronní operace. Zpětné volání se předá volání, které volá rozhraní Microsoft Graph API a aktualizuje uživatelské rozhraní, jakmile se uživatel přihlásí:

mSingleAccountApp.signIn(getActivity(), null, getScopes(), getAuthInteractiveCallback());

Odhlášení uživatele

V SingleAccountModeFragment.javakódu pro odhlášení uživatele je v initializeUI()obslužné rutině signOutButton kliknutí. Odhlášení uživatele je asynchronní operace. Odhlášení uživatele také vymaže mezipaměť tokenů pro tento účet. Jakmile se uživatelský účet odhlásí, vytvoří se zpětné volání, které aktualizuje uživatelské rozhraní:

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        updateUI(null);
        performOperationOnSignOut();
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        displayError(exception);
    }
});

Interaktivní nebo tiché získání tokenu

Pokud chcete uživateli prezentovat co nejmenší počet výzev, obvykle získáte token bezobslužně. Pokud dojde k chybě, zkuste se interaktivně dostat k tokenu. Při prvním volání signIn()aplikace funguje efektivně jako volání acquireToken(), který vyzve uživatele k zadání přihlašovacích údajů.

V některých situacích, kdy se uživateli může zobrazit výzva k výběru účtu, zadání přihlašovacích údajů nebo vyjádření souhlasu s oprávněními, která vaše aplikace požadovala, jsou:

  • Při prvním přihlášení uživatele k aplikaci
  • Pokud uživatel resetuje heslo, bude muset zadat svoje přihlašovací údaje.
  • Pokud je souhlas odvolán
  • Pokud vaše aplikace explicitně vyžaduje souhlas
  • Když aplikace žádá o přístup k prostředku poprvé
  • Pokud se vyžadují vícefaktorové ověřování nebo jiné zásady podmíněného přístupu

Kód, který získá token interaktivně, což je s uživatelským rozhraním, které bude zahrnovat uživatele, je v SingleAccountModeFragment.java, v initializeUI(), v obslužné rutině callGraphApiInteractiveButton kliknutí:

/**
 * If acquireTokenSilent() returns an error that requires an interaction (MsalUiRequiredException),
 * invoke acquireToken() to have the user resolve the interrupt interactively.
 *
 * Some example scenarios are
 *  - password change
 *  - the resource you're acquiring a token for has a stricter set of requirement than your Single Sign-On refresh token.
 *  - you're introducing a new scope which the user has never consented for.
 **/
mSingleAccountApp.acquireToken(getActivity(), getScopes(), getAuthInteractiveCallback());

Pokud už je uživatel přihlášený, acquireTokenSilentAsync() umožňuje aplikacím bezobslužně vyžadovat tokeny, jak je znázorněno v >initializeUI()obslužné rutině callGraphApiSilentButton kliknutí:

/**
 * Once you've signed the user in,
 * you can perform acquireTokenSilent to obtain resources without interrupting the user.
 **/
  mSingleAccountApp.acquireTokenSilentAsync(getScopes(), AUTHORITY, getAuthSilentCallback());

Načtení účtu

Kód pro načtení účtu je v SingleAccountModeFragment.javaloadAccount(). Načtení účtu uživatele je asynchronní operace, takže zpětná volání, která se mají zpracovat, když se účet načte, změní nebo dojde k chybě, předá knihovně MSAL. Následující kód také zpracovává onAccountChanged(), ke kterému dochází při odebrání účtu, uživatel se změní na jiný účet atd.

private void loadAccount() {
    ...

    mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback() {
        @Override
        public void onAccountLoaded(@Nullable IAccount activeAccount) {
            // You can use the account data to update your UI or your app database.
            updateUI(activeAccount);
        }

        @Override
        public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable IAccount currentAccount) {
            if (currentAccount == null) {
                // Perform a cleanup task as the signed-in account changed.
                performOperationOnSignOut();
            }
        }

        @Override
        public void onError(@NonNull MsalException exception) {
            displayError(exception);
        }
    });

Volání Microsoft Graphu

Když je uživatel přihlášený, volání Microsoft Graphu se provede prostřednictvím požadavku HTTP, který callGraphAPI() je definován v SingleAccountModeFragment.java. Tato funkce je obálka, která zjednodušuje ukázku tím, že provádí některé úlohy, jako je získání přístupového tokenu z authenticationResult volání a zabalení volání MSGraphRequestWrapper a zobrazení výsledků volání.

private void callGraphAPI(final IAuthenticationResult authenticationResult) {
    MSGraphRequestWrapper.callGraphAPIUsingVolley(
            getContext(),
            graphResourceTextView.getText().toString(),
            authenticationResult.getAccessToken(),
            new Response.Listener<JSONObject>() {
                @Override
                public void onResponse(JSONObject response) {
                    /* Successfully called graph, process data and send to UI */
                    ...
                }
            },
            new Response.ErrorListener() {
                @Override
                public void onErrorResponse(VolleyError error) {
                    ...
                }
            });
}

auth_config_single_account.json

Toto je konfigurační soubor pro aplikaci MSAL, která používá jeden účet.

Vysvětlení těchto polí najdete v tématu Vysvětlení konfiguračního souboru MSAL pro Android.

Všimněte si přítomnosti "account_mode" : "SINGLE"aplikace, která tuto aplikaci nakonfiguruje tak, aby používala jeden účet.

"client_id" je předem nakonfigurovaný tak, aby používal registraci objektu aplikace, kterou microsoft udržuje. "redirect_uri"je předem nakonfigurovaný tak, aby používal podpisový klíč, který je součástí ukázky kódu.

{
  "client_id" : "0984a7b6-bc13-4141-8b0d-8f767e136bb7",
  "authorization_user_agent" : "DEFAULT",
  "redirect_uri" : "msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D",
  "account_mode" : "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities" : [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

MultipleAccountModeFragment.java

Tento soubor ukazuje, jak vytvořit aplikaci MSAL s více účty a volat rozhraní Microsoft Graph API.

Příkladem aplikace s více účty je poštovní aplikace, která umožňuje pracovat s více uživatelskými účty, jako je pracovní účet a osobní účet.

Inicializace MSAL s více účty

V souboru je v onCreateView()objektu MultipleAccountModeFragment.java aplikace s více účty (IMultipleAccountPublicClientApplication) vytvořen pomocí konfiguračních informací uložených v :auth_config_multiple_account.json file

// Creates a PublicClientApplication object with res/raw/auth_config_multiple_account.json
PublicClientApplication.createMultipleAccountPublicClientApplication(getContext(),
        R.raw.auth_config_multiple_account,
        new IPublicClientApplication.IMultipleAccountApplicationCreatedListener() {
            @Override
            public void onCreated(IMultipleAccountPublicClientApplication application) {
                mMultipleAccountApp = application;
                loadAccounts();
            }

            @Override
            public void onError(MsalException exception) {
                ...
            }
        });

Vytvořený MultipleAccountPublicClientApplication objekt je uložen v členské proměnné třídy, aby bylo možné jej použít k interakci s knihovnou MSAL k získání tokenů a načtení a odebrání uživatelského účtu.

Načtení účtu

K výběru účtu, který se má použít pro operace MSAL, obvykle volá getAccounts() více aplikací účtů. Kód pro načtení účtu je v MultipleAccountModeFragment.java souboru , v loadAccounts(). Načtení účtu uživatele je asynchronní operace. Zpětné volání tedy zpracovává situace, kdy se účet načte, změní nebo dojde k chybě.

/**
 * Load currently signed-in accounts, if there's any.
 **/
private void loadAccounts() {
    if (mMultipleAccountApp == null) {
        return;
    }

    mMultipleAccountApp.getAccounts(new IPublicClientApplication.LoadAccountsCallback() {
        @Override
        public void onTaskCompleted(final List<IAccount> result) {
            // You can use the account data to update your UI or your app database.
            accountList = result;
            updateUI(accountList);
        }

        @Override
        public void onError(MsalException exception) {
            displayError(exception);
        }
    });
}

Interaktivní nebo tiché získání tokenu

V některých situacích, kdy se uživateli může zobrazit výzva k výběru účtu, zadání přihlašovacích údajů nebo vyjádření souhlasu s oprávněními, která vaše aplikace požadovala, jsou:

  • Při prvním přihlášení k aplikaci
  • Pokud uživatel resetuje heslo, bude muset zadat svoje přihlašovací údaje.
  • Pokud je souhlas odvolán
  • Pokud vaše aplikace explicitně vyžaduje souhlas
  • Když aplikace žádá o přístup k prostředku poprvé
  • Pokud se vyžadují vícefaktorové ověřování nebo jiné zásady podmíněného přístupu

Více aplikací účtů by obvykle mělo interaktivně získávat tokeny, to znamená s uživatelským rozhraním, které zahrnuje uživatele s voláním acquireToken(). Kód pro interaktivní získání tokenu je v souboru initializeUI> ()v MultipleAccountModeFragment.java obslužné rutině callGraphApiInteractiveButton kliknutí:

/**
 * Acquire token interactively. It will also create an account object for the silent call as a result (to be obtained by > getAccount()).
 *
 * If acquireTokenSilent() returns an error that requires an interaction,
 * invoke acquireToken() to have the user resolve the interrupt interactively.
 *
 * Some example scenarios are
 *  - password change
 *  - the resource you're acquiring a token for has a stricter set of requirement than your SSO refresh token.
 *  - you're introducing a new scope which the user has never consented for.
 **/
mMultipleAccountApp.acquireToken(getActivity(), getScopes(), getAuthInteractiveCallback());

Aplikace by neměly vyžadovat, aby se uživatel při každém vyžádání tokenu přihlásil. Pokud je uživatel již přihlášený, acquireTokenSilentAsync() umožňuje aplikacím požadovat tokeny bez výzvy uživatele, jak je znázorněno v MultipleAccountModeFragment.java souboru, vinitializeUI() obslužné rutině callGraphApiSilentButton kliknutí:

/**
 * Performs acquireToken without interrupting the user.
 *
 * This requires an account object of the account you're obtaining a token for.
 * (can be obtained via getAccount()).
 */
mMultipleAccountApp.acquireTokenSilentAsync(getScopes(),
    accountList.get(accountListSpinner.getSelectedItemPosition()),
    AUTHORITY,
    getAuthSilentCallback());

Odebrání účtu

Kód pro odebrání účtu a všechny tokeny uložené v mezipaměti pro tento účet jsou v MultipleAccountModeFragment.java souboru v initializeUI() obslužné rutině tlačítka pro odebrání účtu. Před odebráním účtu potřebujete objekt účtu, který získáte z metod MSAL jako getAccounts() a acquireToken(). Vzhledem k tomu, že odebrání účtu je asynchronní operace, onRemoved zadává se zpětná volání pro aktualizaci uživatelského rozhraní.

/**
 * Removes the selected account and cached tokens from this app (or device, if the device is in shared mode).
 **/
mMultipleAccountApp.removeAccount(accountList.get(accountListSpinner.getSelectedItemPosition()),
        new IMultipleAccountPublicClientApplication.RemoveAccountCallback() {
            @Override
            public void onRemoved() {
                ...
                /* Reload account asynchronously to get the up-to-date list. */
                loadAccounts();
            }

            @Override
            public void onError(@NonNull MsalException exception) {
                displayError(exception);
            }
        });

auth_config_multiple_account.json

Toto je konfigurační soubor pro aplikaci MSAL, která používá více účtů.

Vysvětlení různých polí najdete v tématu Vysvětlení konfiguračního souboru MSAL pro Android.

Na rozdíl od konfiguračního souboru auth_config_single_account.json"account_mode" : "MULTIPLE" tento konfigurační soubor místo "account_mode" : "SINGLE" toho, že se jedná o aplikaci s více účty.

"client_id" je předem nakonfigurovaný tak, aby používal registraci objektu aplikace, kterou microsoft udržuje. "redirect_uri"je předem nakonfigurovaný tak, aby používal podpisový klíč, který je součástí ukázky kódu.

{
  "client_id" : "0984a7b6-bc13-4141-8b0d-8f767e136bb7",
  "authorization_user_agent" : "DEFAULT",
  "redirect_uri" : "msauth://com.azuresamples.msalandroidapp/1wIqXSqBj7w%2Bh11ZifsnqwgyKrY%3D",
  "account_mode" : "MULTIPLE",
  "broker_redirect_uri_registered": true,
  "authorities" : [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

Nápověda a podpora

Pokud potřebujete pomoc, chcete nahlásit problém nebo se chcete dozvědět o možnostech podpory, přečtěte si nápovědu a podporu pro vývojáře.

Další kroky

Přejděte k kurzu pro Android, ve kterém vytvoříte aplikaci pro Android, která získá přístupový token z platformy Microsoft Identity Platform a použije ji k volání rozhraní Microsoft Graph API.