Aplicaciones cliente públicas de una o varias cuentas
Este artículo le ayudará a comprender los tipos que se usan en las aplicaciones cliente públicas de una o varias cuentas, con especial atención a las aplicaciones cliente públicas de una sola cuenta.
La biblioteca de autenticación de Microsoft (MSAL) modela la aplicación cliente. La mayoría de las aplicaciones de Android se consideran aplicaciones cliente públicas. Una aplicación cliente pública es una aplicación que no puede mantener un secreto de forma segura.
MSAL especializa la superficie de la API de PublicClientApplication
para simplificar y aclarar la experiencia de desarrollo de las aplicaciones que solo permiten el uso de una cuenta a la vez. PublicClientApplication
tiene las subclases SingleAccountPublicClientApplication
y MultipleAccountPublicClientApplication
. En el diagrama siguiente se muestra la relación entre estas clases.
Aplicación cliente pública de una sola cuenta
La clase SingleAccountPublicClientApplication
permite crear una aplicación basada en MSAL que solo permite iniciar sesión a una sola cuenta a la vez. SingleAccountPublicClientApplication
difiere de PublicClientApplication
en lo siguiente:
- MSAL realiza un seguimiento de la cuenta que tiene iniciada la sesión actualmente.
- Si la aplicación usa un agente (el predeterminado durante el registro de la aplicación en Azure Portal) y está instalado en un dispositivo en el que hay un agente, MSAL comprobará que la cuenta sigue estando disponible en el dispositivo.
signIn
permite iniciar sesión en una cuenta de forma explícita y independiente de los ámbitos de la solicitud.acquireTokenSilent
no requiere un parámetro de cuenta. Si proporciona una cuenta y la cuenta que proporciona no coincide con la cuenta actual cuyo seguimiento se realiza mediante MSAL, se produce la excepciónMsalClientException
.acquireToken
no permite al usuario cambiar de cuenta. Si el usuario intenta cambiar a una cuenta diferente, se produce una excepción.getCurrentAccount
devuelve un objeto de resultado que proporciona lo siguiente:- Un valor booleano que indica si la cuenta ha cambiado. Una cuenta puede cambiar como resultado de la eliminación del dispositivo, por ejemplo.
- La cuenta anterior. Esto resulta útil si necesita realizar una limpieza de datos local cuando la cuenta se quita del dispositivo o cuando una cuenta nueva inicia sesión.
- La cuenta actual.
signOut
quita del dispositivo todos los tokens asociados con el cliente.
Cuando hay un agente de autenticación de Android, como Microsoft Authenticator o Portal de empresa de Intune, instalado en el dispositivo y la aplicación está configurada para usar el agente, signOut
no quitará la cuenta del dispositivo.
Escenario de una sola cuenta
En el siguiente pseudocódigo se muestra el uso de 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;
}
Aplicación cliente pública de varias cuentas
La clase MultipleAccountPublicClientApplication
se usa para crear aplicaciones basadas en MSAL que permitan que varias cuentas inicien sesión al mismo tiempo. Permite obtener, agregar y quitar cuentas de la siguiente manera:
Agregar una cuenta
Use una o varias cuentas en la aplicación llamando a acquireToken
una o varias veces.
Obtención de cuentas
- Llame a
getAccount
para obtener una cuenta específica. - Llame a
getAccounts
para obtener una lista de las cuentas que la aplicación conoce actualmente.
La aplicación no podrá enumerar todas las cuentas de la Plataforma de identidad de Microsoft en el dispositivo conocido por la aplicación de agente. Solo puede enumerar las cuentas usadas por la aplicación. Estas funciones no devolverán las cuentas que se hayan quitado del dispositivo.
Eliminación de una cuenta
Para quitar una cuenta, llame a removeAccount
con un identificador de cuenta.
Si la aplicación está configurada para usar un agente y se instala un agente en el dispositivo, la cuenta no se quitará del agente cuando llame a removeAccount
. Solo se quitan los tokens asociados con el cliente.
Escenario de varias cuentas
En el siguiente pseudocódigo se muestra cómo crear una aplicación de varias cuentas, enumerar cuentas en el dispositivo y adquirir tokens.
// 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)
{
}
});