Aplicativos cliente públicos de conta única e de múltiplas contas

Este artigo ajudará você a entender os tipos usados em aplicativos cliente públicos de conta única e várias, com foco em aplicativos cliente públicos de conta única.

A ADAL (Biblioteca de Autenticação de Azure Active Directory) modela o servidor. Em vez disso, o Biblioteca do Microsoft Authenticator (MSAL) modela seu aplicativo cliente. A maioria dos aplicativos Android são considerados clientes públicos. Um cliente público é um aplicativo que não pode manter um segredo com segurança.

A MSAL especializa a superfície da API de PublicClientApplication para simplificar e esclarecer a experiência de desenvolvimento de aplicativos que permitem o uso de apenas uma conta por vez. PublicClientApplication tem como subclasses SingleAccountPublicClientApplication e MultipleAccountPublicClientApplication. O diagrama a seguir mostra a relação entre essas classes.

Diagrama de classe UML de SingleAccountPublicClientApplication

Aplicativo cliente público de conta única

A SingleAccountPublicClientApplication classe permite que você crie um aplicativo baseado em MSAL que só permita que uma única conta seja conectado por vez. SingleAccountPublicClientApplication difere de PublicClientApplication das seguintes maneiras:

  • A MSAL rastreia a conta atualmente conectada.
    • Se o aplicativo estiver usando um agente (o padrão durante Microsoft Entra registro de aplicativo) e estiver instalado em um dispositivo em que um agente está presente, a MSAL verificará se a conta ainda está disponível no dispositivo.
  • signIn permite que você conecte uma conta explicitamente e de forma separada dos escopos de solicitação.
  • acquireTokenSilent não requer um parâmetro de conta. Se você fornecer uma conta e a conta fornecida não corresponder à conta atual rastreada pela MSAL, MsalClientException será gerado.
  • acquireToken não permite que o usuário mude de conta. Se o usuário tentar mudar para uma conta diferente, uma exceção será gerada.
  • getCurrentAccount retorna um objeto de resultado que fornece o seguinte:
    • Um booliano que indica se a conta foi alterada. Uma conta pode ser alterada como resultado da remoção do dispositivo, por exemplo.
    • A conta anterior. Isso é útil se você precisar fazer alguma limpeza local de dados quando a conta for removida do dispositivo ou quando uma nova conta fizer login.
    • A currentAccount.
  • signOut remove todos os tokens associados ao seu cliente do dispositivo.

Quando um agente de Autenticação do Android, como Microsoft Authenticator, Link para Windows (LTW) ou Intune Portal da Empresa estiver instalado no dispositivo e seu aplicativo estiver configurado para usar o agente, signOut não removerá a conta do dispositivo.

Cenário de conta única

O pseudocódigo a seguir ilustra o 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.
SignInParameters signInParameters = SignInParameters.builder()
        .withActivity(getActivity()) // Pass the current activity
        .withScopes(scopes) // Specify the scopes
        .withCallback(new AuthenticationCallback() {
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult){
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
        })
        .build();


app.signIn(signInParameters);

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

Aplicativo cliente público de várias contas

A MultipleAccountPublicClientApplication classe é usada para criar aplicativos baseados em MSAL que permitem que várias contas sejam conectados ao mesmo tempo. Ele permite que você obtenha, adicione e remova contas da seguinte maneira:

Adicionar uma conta

Use uma ou mais contas em seu aplicativo chamando acquireToken uma ou mais vezes.

Obter contas

  • Chame getAccount para obter uma conta específica.
  • Chame getAccountspara obter uma lista de contas atualmente conhecidas pelo aplicativo.

Seu aplicativo não poderá enumerar todas as contas da plataforma de identidade da Microsoft no dispositivo conhecido pelo aplicativo do agente. Ele só pode enumerar contas que foram usadas pelo seu aplicativo. As contas que foram removidas do dispositivo não serão retornadas por essas funções.

Remover uma conta

Remova uma conta chamando removeAccount com um identificador de conta.

Se o aplicativo estiver configurado para usar um agente e um agente estiver instalado no dispositivo, a conta não será removida do agente quando você chamar removeAccount. Somente os tokens associados ao seu cliente são removidos.

Cenário de várias contas

O pseudocódigo a seguir mostra como criar um aplicativo de várias contas, listar contas no dispositivo e 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
AcquireTokenParameters acquireTokenParameters = new AcquireTokenParameters.Builder()
        .startAuthorizationFromActivity(getActivity())
        .withScopes(scopes)
        .withCallback(new AuthenticationCallback(){
    
            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
    
            @Override
            public void onCancel(){
            }
         })
        .build();
app.acquireToken(acquireTokenParameters);


...

// 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
AcquireTokenSilentParameters acquireTokenSilentParameters = new AcquireTokenSilentParameters.Builder()
        .withScopes(scopes)
        .forAccount(selectedAccount)
        .fromAuthority(authority)
        .withCallback(new SilentAuthenticationCallback() {

            @Override
            public void onSuccess(IAuthenticationResult authenticationResult) {
                mAccount = authenticationResult.getAccount();
            }
    
            @Override
            public void onError(MsalException exception){
            }
        })
        .build();
app.acquireTokenSilentAsync(acquireTokenSilentParameters);