Modo de dispositivo compartilhado para dispositivos Android

Com frequência, os trabalhadores na linha de frente, como funcionários do comércio, membros de tripulações e trabalhadores de serviços de campo, usam um dispositivo móvel compartilhado para realizar seu trabalho. Esses dispositivos compartilhados podem apresentar riscos de segurança se os usuários compartilharem suas senhas ou PINs, intencionalmente ou não, para acessar dados de clientes e empresas no dispositivo compartilhado.

O modo de dispositivo compartilhado permite a configuração de um dispositivo Android 8.0 ou superior, de modo que os funcionários possam compartilhar o dispositivo de forma segura. Os funcionários podem fazer logon uma vez e obter o SSO (logon único) de todos os aplicativos compatíveis com esse recurso, concedendo acesso mais rápido às informações. Quando os funcionários saem depois de concluir seu turno ou tarefa, eles são automaticamente desconectados do dispositivo e de todos os aplicativos compatíveis, deixando o dispositivo pronto para o próximo usuário.

Para aproveitar o recurso do modo de dispositivo compartilhado, os desenvolvedores de aplicativos e administradores de dispositivos de nuvem trabalham juntos:

  1. Os Administradores de dispositivos preparam o dispositivo a ser compartilhado manualmente usando um provedor de MDM (gerenciamento de dispositivo móvel) como o Microsoft Intune. A opção preferida é usar um MDM, pois permite a configuração do dispositivo no modo de dispositivo compartilhado em escala por meio do provisionamento zero-touch. O MDM efetua push do aplicativo Microsoft Authenticator para os dispositivos e ativa o "Modo compartilhado" para cada dispositivo por meio de uma atualização de configuração gerenciada para o dispositivo. Essa configuração do Modo compartilhado é o que altera o comportamento dos aplicativos com suporte no dispositivo. Essa configuração do provedor de MDM define o modo de dispositivo compartilhado para o dispositivo e aciona o registro de dispositivo compartilhado usando o aplicativo Authenticator.

  2. Os desenvolvedores de aplicativos gravam um aplicativo de conta única (aplicativos de várias contas não são compatíveis com o modo dispositivo compartilhado) para administrar o seguinte cenário:

    • Conecte-se a um dispositivo de usuário em todo o aplicativo com suporte
    • Desconecte-se de um dispositivo de usuário em todo o aplicativo com suporte
    • Consulte o estado do dispositivo para determinar se seu aplicativo está em um dispositivo que está no modo de dispositivo compartilhado
    • Consulte o estado do dispositivo do usuário para determinar mudanças no seu aplicativo desde o último uso

    O suporte ao modo dispositivo compartilhado deve ser considerado uma atualização de recurso para o aplicativo e pode ajudar a aumentar a adoção em ambientes no qual o mesmo dispositivo é usado entre vários usuários.

    Importante

    Os aplicativos da Microsoft que dão suporte ao modo de dispositivo compartilhado no Android não exigem alterações e só precisam ser instalados no dispositivo para obter os benefícios que vêm com o modo de dispositivo compartilhado.

Configurar o dispositivo no modo dispositivo compartilhado

Para configurar seu dispositivo Android para oferecer suporte ao modo de dispositivo compartilhado, ele deve estar executando o sistema operacional Android 8.0 ou posterior. O dispositivo também deve ser apagado pela redefinição de fábrica ou ter todos os aplicativos habilitados para o modo de dispositivo compartilhado da Microsoft e outros aplicativos desinstalados e reinstalados.

O Microsoft Intune é compatível com o provisionamento zero-touch para dispositivos no modo dispositivo compartilhado do Microsoft Entra, o que significa que o dispositivo pode ser configurado e inscrito no Intune com interação mínima do trabalhador na linha de frente. Para configurar o dispositivo no modo dispositivo compartilhado ao usar o Microsoft Intune como o MDM, confira Configurar inscrição para dispositivos no modo dispositivo compartilhado do Microsoft Entra.

Modificar seu aplicativo Android para dar suporte ao modo de dispositivo compartilhado

Seus usuários dependem de você para garantir que seus dados não sejam vazados para outro usuário. As seções a seguir fornecem sinais úteis para indicar ao aplicativo que uma alteração ocorreu e deve ser tratada. Você é responsável por verificar o estado do usuário no dispositivo toda vez que seu aplicativo é usado e, em seguida, limpar os dados do usuário anterior. Isso inclui se ele foi recarregado a partir do plano de fundo em várias tarefas. Em uma alteração de usuário, é necessário garantir que os dados do usuário anterior sejam apagados e que todos os dados armazenados em cache que estão sendo exibidos em seu aplicativo sejam removidos. É altamente recomendável que você e sua empresa realizem um processo de revisão da segurança após atualizar o aplicativo, para manter a compatibilidade com o modo dispositivo compartilhado.

Adicionar o SDK da MSAL (Biblioteca de Autenticação da Microsoft) às dependências do aplicativo

Adicione a biblioteca do MSAL como uma dependência no arquivo build.gradle, desta forma:

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

Configure seu aplicativo para usar o modo dispositivo compartilhado

Os aplicativos escritos usando o SDK da MSAL (Biblioteca de Autenticação da Microsoft) podem gerenciar uma única conta ou várias contas. Para obter detalhes, consulte modo conta única ou modo várias contas. Os aplicativos do modo dispositivo compartilhado funcionam apenas no modo conta única.

Se você não estiver planejando dar suporte ao modo de várias contas, defina "account_mode" como "SINGLE" no arquivo de configuração msal. Isso garante que o aplicativo sempre obtenha ISingleAccountPublicClientApplication e simplifica significativamente a integração do MSAL. O valor padrão de "account_mode" é "MULTIPLE", portanto é importante alterar esse valor no arquivo de configuração se você estiver usando o modo "single account".

Aqui está um exemplo do arquivo de configuração:

{
  "client_id": "Client ID after app registration at https://aka.ms/MobileAppReg",
  "authorization_user_agent": "WEBVIEW",
  "redirect_uri": "Redirect URI after app registration at https://aka.ms/MobileAppReg",
  "account_mode": "SINGLE",
  "broker_redirect_uri_registered": true,
  "authorities": [
    {
      "type": "AAD",
      "audience": {
        "type": "AzureADandPersonalMicrosoftAccount",
        "tenant_id": "common"
      }
    }
  ]
}

Consulte a documentação de configuração para obter mais informações sobre como definir o arquivo de configuração.

Suporte à conta única e a várias contas

Seu aplicativo pode ser criado para dar suporte à execução em dispositivos pessoais e compartilhados. Se seu aplicativo atualmente dá suporte a várias contas e você deseja dar suporte ao modo de dispositivo compartilhado, adicione suporte para o modo de conta única.

Você também pode querer que seu aplicativo altere o comportamento a depender do tipo de dispositivo onde ele está sendo executado. Use ISingleAccountPublicClientApplication.isSharedDevice() para determinar quando executar no modo de conta única.

Há duas interfaces diferentes que representam o tipo de dispositivo no qual seu aplicativo está. Quando você solicita uma instância de aplicativo do Application Factory da MSAL, o objeto de aplicativo correto é fornecido automaticamente.

O modelo de objeto a seguir ilustra o tipo de objeto que você pode receber e o que significa no contexto de um dispositivo compartilhado:

modelo de herança do aplicativo cliente público

Você precisa fazer uma verificação de tipo e uma conversão para a interface apropriada ao obter o objeto PublicClientApplication. O código a seguir verifica os modos de várias contas ou de conta única e faz a conversão apropriada do objeto de aplicativo:

private IPublicClientApplication mApplication;

        // Running in personal-device mode?
        if (mApplication instanceOf IMultipleAccountPublicClientApplication) {
          IMultipleAccountPublicClientApplication multipleAccountApplication = (IMultipleAccountPublicClientApplication) mApplication;
          ...
        // Running in shared-device mode?
        } else if (mApplication instanceOf ISingleAccountPublicClientApplication) {
           ISingleAccountPublicClientApplication singleAccountApplication = (ISingleAccountPublicClientApplication) mApplication;
            ...
        }

As seguintes diferenças se aplicam dependendo se seu aplicativo está em execução em um dispositivo compartilhado ou pessoal:

Dispositivo no modo compartilhado Dispositivo pessoal
Contas Conta única Várias contas
Entrar Global Global
Sair Global Cada aplicativo pode controlar se a saída é local para o aplicativo ou para a família de aplicativos.
Tipos de conta compatíveis Somente contas corporativas Contas pessoais e corporativas compatíveis

Inicializar o objeto PublicClientApplication

Se você definir "account_mode":"SINGLE" no arquivo de configuração do MSAL, você poderá converter com segurança o objeto de aplicativo retornado como um ISingleAccountPublicCLientApplication.

private ISingleAccountPublicClientApplication mSingleAccountApp;

PublicClientApplication.create(
    this.getApplicationCOntext(),
    R.raw.auth_config_single_account,
    new PublicClientApplication.ApplicationCreatedListener() {

        @Override
        public void onCreated(IPublicClientApplication application){
            mSingleAccountApp = (ISingleAccountPublicClientApplication)application;
        }

        @Override
        public void onError(MsalException exception){
            /*Fail to initialize PublicClientApplication */
        }
    });

Detectar modo dispositivo compartilhado

Detectar o modo de dispositivo compartilhado é importante para seu aplicativo. Muitos aplicativos precisarão de uma alteração na experiência do usuário (UX) quando o aplicativo for usado em um dispositivo compartilhado. Por exemplo, seu aplicativo pode ter um recurso de "Inscrição", que não é adequado para um trabalhador da linha de frente porque eles, provavelmente, já têm uma conta. Talvez você também queira adicionar segurança extra à manipulação de dados do seu aplicativo se ele estiver no modo de dispositivo compartilhado.

Use a API isSharedDevice no IPublicClientApplication para determinar se um aplicativo está em execução em um dispositivo no modo de dispositivo compartilhado.

Os trechos de código a seguir mostram exemplos de como usar a API isSharedDevice.

deviceModeTextView.setText(mSingleAccountApp.isSharedDevice() ? "Shared" : "Non-Shared");

Conheça o usuário conectado e determine se um usuário foi alterado no dispositivo

Outra parte importante do suporte ao modo de dispositivo compartilhado é determinar o estado do usuário no dispositivo e limpar os dados do aplicativo se um usuário tiver mudado ou se não houver nenhum usuário no dispositivo. Você é responsável por garantir que os dados não sejam vazados para outro usuário.

É possível usar a API getCurrentAccountAsync para consultar a conta conectada no dispositivo.

O método loadAccount recupera a conta do usuário conectado. O método onAccountChanged determina se o usuário conectado mudou e, nesse caso, limpa:

private void loadAccount()
{
  mSingleAccountApp.getCurrentAccountAsync(new ISingleAccountPublicClientApplication.CurrentAccountCallback())
  {
    @Override
    public void onAccountLoaded(@Nullable IAccount activeAccount)
    {
      if (activeAccount != null)
      {
        signedInUser = activeAccount;
        final AcquireTokenSilentParameters silentParameters = new AcquireTokenSilentParameters.Builder()
                        .fromAuthority(signedInUser.getAuthority())
                        .forAccount(signedInUser)
                        .withScopes(Arrays.asList(getScopes()))
                        .withCallback(getAuthSilentCallback())
                        .build();
        mSingleAccountApp.acquireTokenSilentAsync(silentParameters);
      }
    }
    @Override
    public void onAccountChanged(@Nullable IAccount priorAccount, @Nullable Iaccount currentAccount)
    {
      if (currentAccount == null)
      {
        //Perform a cleanup task as the signed-in account changed.
        cleaUp();
      }
    }
    @Override
    public void onError(@NonNull Exception exception)
    {
        //getCurrentAccountAsync failed
    }
  }
}

Conectar um usuário globalmente

Quando um dispositivo é configurado como um dispositivo compartilhado, seu aplicativo poderá chamar a API signIn para entrar na conta. A conta estará disponível globalmente para todos os aplicativos qualificados no dispositivo depois que o primeiro aplicativo entrar na conta.

final SignInParameters signInParameters = ... /* create SignInParameters object */
mSingleAccountApp.signIn(signInParameters);

Desconectar um usuário globalmente

O código a seguir remove a conta conectada e limpa os tokens em cache não apenas do aplicativo, mas também do dispositivo que está no modo de dispositivo compartilhado. No entanto, ele não limpa os dados do seu aplicativo. É necessário limpar os dados do aplicativo e limpar todos os dados armazenados em cache que o aplicativo exibir para o usuário.

mSingleAccountApp.signOut(new ISingleAccountPublicClientApplication.SignOutCallback() {
    @Override
    public void onSignOut() {
        // clear data from your application
    }

    @Override
    public void onError(@NonNull MsalException exception) {
        // signout failed, show error
    }
});

Receber transmissão para detectar a saída global iniciada em outros aplicativos

Para receber uma difusão de alteração de conta, você precisa registrar um receptor de difusão. É recomendável registrar o receptor de difusão por meio dos Receptores registrados com contexto.

Quando uma difusão de alteração de conta for recebida, obtenha imediatamente o usuário conectado e determine se o usuário foi alterado no dispositivo. Se uma alteração for detectada, inicie a limpeza de dados da conta inserida anteriormente. É recomendável interromper corretamente todas as operações e fazer a limpeza dos dados.

O snippet de código abaixo mostra como você pode registrar um receptor de transmissão.

private static final String CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER = "com.microsoft.identity.client.sharedmode.CURRENT_ACCOUNT_CHANGED";
private BroadcastReceiver mAccountChangedBroadcastReceiver;
private void registerAccountChangeBroadcastReceiver(){
    mAccountChangedBroadcastReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            //INVOKE YOUR PRIOR ACCOUNT CLEAN UP LOGIC HERE
        }
    };
    IntentFilter filter = new

    IntentFilter(CURRENT_ACCOUNT_CHANGED_BROADCAST_IDENTIFIER);
    this.registerReceiver(mAccountChangedBroadcastReceiver, filter);
}

Aplicativos da Microsoft compatíveis com o modo dispositivo compartilhado

Esses aplicativos da Microsoft dão suporte ao modo de dispositivo compartilhado do Microsoft Entra:

MDMs de terceiros compatíveis com o modo dispositivo compartilhado

Esses fornecedores de MDM (Gerenciamento de Dispositivo Móvel) dão suporte ao modo de dispositivo compartilhado do Microsoft Entra:

Saída do dispositivo compartilhado e ciclo de vida geral do aplicativo

Quando um usuário sair, você precisará tomar medidas para proteger a privacidade e os dados do usuário. Por exemplo, se você estiver criando um aplicativo de registros médicos, certifique-se de que, quando o usuário sair, os registros de pacientes exibidos anteriormente sejam limpos. Seu aplicativo deve estar preparado para privacidade de dados e verificação de dados a cada vez que ele entrar no primeiro plano.

Quando seu aplicativo usa MSAL para desconectar o usuário em um aplicativo em execução no dispositivo que está no modo compartilhado, a conta conectada e os tokens armazenados em cache são removidos do aplicativo e do dispositivo.

O diagrama a seguir mostra o ciclo de vida geral do aplicativo e eventos comuns que podem ocorrer enquanto seu aplicativo é executado. O diagrama abrange desde o momento em que uma atividade é iniciada, o processo de entrada e saída de uma conta e como eventos como pausar, retomar e encerrar a atividade se encaixam.

Ciclo de vida do aplicativo em um dispositivo compartilhado

Próximas etapas

Configure um dispositivo Android para executar aplicativos no modo de dispositivo compartilhado e teste seu aplicativo.

Modo dispositivo compartilhado para dispositivos Android