Veřejné klientské aplikace s jedním a více účty

Tento článek vám pomůže pochopit typy používané v jednoúčelových veřejných klientských aplikacích s více účty a zaměřit se na veřejné klientské aplikace s jedním účtem.

Microsoft Authentication Library (MSAL) modeluje vaši klientskou aplikaci. Většina aplikací pro Android se považuje za veřejné klienty. Veřejný klient je aplikace, která nemůže bezpečně uchovávat tajný kód.

MSAL se specializuje na rozhraní PublicClientApplication API pro zjednodušení a objasnění vývojového prostředí pro aplikace, které umožňují používat vždy jenom jeden účet. PublicClientApplication je podtříděna podle SingleAccountPublicClientApplication a MultipleAccountPublicClientApplication. Následující diagram znázorňuje vztah mezi těmito třídami.

SingleAccountPublicClientApplication UML Class Diagram

Veřejná klientská aplikace s jedním účtem

Třída SingleAccountPublicClientApplication umožňuje vytvořit aplikaci založenou na MSAL, která umožňuje přihlášení pouze jednoho účtu najednou. SingleAccountPublicClientApplication se liší od PublicClientApplication následujících způsobů:

  • MSAL sleduje aktuálně přihlášený účet.
    • Pokud vaše aplikace používá zprostředkovatele (výchozí nastavení při registraci aplikace na webu Azure Portal) a je nainstalovaná na zařízení, ve kterém je zprostředkovatel, nástroj MSAL ověří, jestli je účet na zařízení stále dostupný.
  • signIn umožňuje explicitně a odděleně od vyžádání oborů přihlásit se k účtu.
  • acquireTokenSilent nevyžaduje parametr účtu. Pokud zadáte účet a zadaný účet neodpovídá aktuálnímu účtu sledovanému službou MSAL, vyvolá se chyba MsalClientException .
  • acquireToken neumožňuje uživateli přepnout účty. Pokud se uživatel pokusí přepnout na jiný účet, vyvolá se výjimka.
  • getCurrentAccount vrátí objekt výsledku, který poskytuje následující:
    • Logická hodnota označující, jestli se účet změnil. Účet se může změnit například v důsledku odebrání ze zařízení.
    • Předchozí účet. To je užitečné, pokud potřebujete provést vyčištění místních dat, když je účet odebrán ze zařízení nebo když je nový účet přihlášený.
    • Aktuální účet.
  • signOut odebere všechny tokeny přidružené k vašemu klientovi ze zařízení.

Pokud je na zařízení nainstalovaný zprostředkovatel ověřování androidu, jako je Microsoft Authenticator nebo Portál společnosti Intune a vaše aplikace je nakonfigurovaná tak, aby používala zprostředkovatele, signOut neodebere účet ze zařízení.

Scénář s jedním účtem

Následující pseudokód znázorňuje použití SingleAccountPublicClientApplication.

// Construct Single Account Public Client Application
ISingleAccountPublicClientApplication app = PublicClientApplication.createSingleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will get a UI prompt before getting the token.
app.signIn(getActivity(), scopes, new AuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
    }
);

// Load Account Specific Data
getDataForAccount(account);

// Get Current Account
ICurrentAccountResult currentAccountResult = app.getCurrentAccount();
if (currentAccountResult.didAccountChange())
{
    // Account Changed Clear existing account data
    clearDataForAccount(currentAccountResult.getPriorAccount());
    mAccount = currentAccountResult.getCurrentAccount();
    if (account != null)
    {
        //load data for new account
        getDataForAccount(account);
    }
}

// Sign out
if (app.signOut())
{
    clearDataForAccount(mAccount);
    mAccount = null;
}

Veřejná klientská aplikace s více účty

Třída MultipleAccountPublicClientApplication se používá k vytváření aplikací založených na MSAL, které umožňují přihlášení více účtů najednou. Umožňuje získat, přidat a odebrat účty následujícím způsobem:

Přidání účtu

Použijte jeden nebo více účtů ve vaší aplikaci voláním acquireToken jednou nebo vícekrát.

Získání účtů

  • Volání getAccount pro získání konkrétního účtu
  • Volání getAccountspro získání seznamu účtů, které jsou pro aplikaci aktuálně známé.

Vaše aplikace nebude moct vytvořit výčet všech účtů Microsoft Identity Platform na zařízení známém v aplikaci zprostředkovatele. Může vytvořit výčet jenom účtů, které vaše aplikace používala. Tyto funkce nevrátí účty, které byly ze zařízení odebrány.

Odebrání účtu

Odeberte účet voláním removeAccount s identifikátorem účtu.

Pokud je vaše aplikace nakonfigurovaná tak, aby používala zprostředkovatele a na zařízení se nainstaluje zprostředkovatel, účet se při volání neodebere removeAccountzprostředkovatele. Odeberou se jenom tokeny přidružené k vašemu klientovi.

Scénář s více účty

Následující pseudokód ukazuje, jak vytvořit aplikaci s více účty, vypsat účty na zařízení a získat tokeny.

// Construct Multiple Account Public Client Application
IMultipleAccountPublicClientApplication app = PublicClientApplication.createMultipleAccountPublicClientApplication(getApplicationContext(), R.raw.msal_config);

String[] scopes = {"User.Read"};
IAccount mAccount = null;

// Acquire a token interactively
// The user will be required to interact with a UI to obtain a token
app.acquireToken(getActivity(), scopes, new AuthenticationCallback()
 {

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

        @Override
        public void onError(MsalException exception)
        {
        }

        @Override
        public void onCancel()
        {
        }
 });

...

// Get the default authority
String authority = app.getConfiguration().getDefaultAuthority().getAuthorityURL().toString();

// Get a list of accounts on the device
List<IAccount> accounts = app.getAccounts();

// Pick an account to obtain a token from without prompting the user to sign in
IAccount selectedAccount = accounts.get(0);

// Get a token without prompting the user
app.acquireTokenSilentAsync(scopes, selectedAccount, authority, new SilentAuthenticationCallback()
{

        @Override
        public void onSuccess(IAuthenticationResult authenticationResult) 
        {
            mAccount = authenticationResult.getAccount();
        }

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