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.
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 chybaMsalClientException
.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í
getAccounts
pro 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 removeAccount
zprostř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)
{
}
});