Tutorial: Preparar seu aplicativo móvel Android para autenticação nativa

Este tutorial demonstra como adicionar o SDK de autenticação nativa da MSAL (Biblioteca de Autenticação da Microsoft) a um aplicativo móvel Android.

Neste tutorial, você aprenderá a:

  • Adicionar dependências da MSAL.
  • Criar um arquivo de configuração.
  • Crie uma instância do SDK da MSAL.

Pré-requisitos

  • Se ainda não o fez, siga as instruções em Conectar usuários no aplicativo móvel Android (Kotlin) de exemplo usando autenticação nativa e registre um aplicativo no locatário externo. Certifique-se de concluir as seguintes etapas:
    • Registre um aplicativo.
    • Habilite os fluxos do cliente público e da autenticação nativa.
    • Conceder permissões de API.
    • Criar um fluxo de usuário.
    • Associe o aplicativo ao fluxo do usuário.
  • Um projeto Android. Se você não tiver um projeto Android, crie-o.

Adicionar dependências da MSAL

  1. Abra seu projeto no Android Studio ou crie um projeto.

  2. Abra o build.gradle do aplicativo e adicione as seguintes dependências:

    allprojects {
        repositories {
            //Needed for com.microsoft.device.display:display-mask library
            maven {
                url 'https://pkgs.dev.azure.com/MicrosoftDeviceSDK/DuoSDK-Public/_packaging/Duo-SDK-Feed/maven/v1'
                name 'Duo-SDK-Feed'
            }
            mavenCentral()
            google()
        }
    }
    //...
    
    dependencies { 
        implementation 'com.microsoft.identity.client:msal:5.+'
        //...
    }
    
  3. No Android Studio, selecione Arquivo>Sincronizar Projeto com Arquivos do Gradle.

Criar um arquivo de configuração

Você passa os identificadores de locatário necessários, como a ID do aplicativo (cliente), para o SDK da MSAL por meio de uma configuração JSON.

Use estas etapas para criar o arquivo de configuração:

  1. No painel do projeto do Android Studio, navegue até app\src\main\res.

  2. Clique com o botão direito do mouse em res e selecione Novo>Diretório. Insira raw como o nome do novo diretório e selecione OK.

  3. Em app\src\main\res\raw, crie um novo arquivo JSON chamado auth_config_native_auth.json.

  4. No arquivo auth_config_native_auth.json, adicione as seguintes configurações da MSAL:

    { 
      "client_id": "Enter_the_Application_Id_Here", 
      "authorities": [ 
        { 
          "type": "CIAM", 
          "authority_url": "https://Enter_the_Tenant_Subdomain_Here.ciamlogin.com/Enter_the_Tenant_Subdomain_Here.onmicrosoft.com/" 
        } 
      ], 
      "challenge_types": ["oob"], 
      "logging": { 
        "pii_enabled": false, 
        "log_level": "INFO", 
        "logcat_enabled": true 
      } 
    } 
     //...
    
  5. Substitua os seguintes espaços reservados pelos valores de locatário obtidos no Centro de administração do Microsoft Entra:

    • Substitua o espaço reservado Enter_the_Application_Id_Here pela ID do aplicativo (cliente) do aplicativo que você registrou anteriormente.
    • Substitua Enter_the_Tenant_Subdomain_Here pelo subdomínio do diretório (locatário). Por exemplo, se o domínio primário do locatário for contoso.onmicrosoft.com, use contoso. Se você não tiver o nome do locatário, saiba como ler os detalhes do locatário.

    Os tipos de desafio são uma lista de valores, que o aplicativo usa para notificar o Microsoft Entra sobre o método de autenticação compatível.

    • Para fluxos de inscrição e entrada com senha de uso único por email, use ["oob"].
    • Para fluxos de inscrição e entrada com email e senha, use ["oob","password"].
    • Para redefinição de senha self-service (SSPR), use ["oob"].

    Saiba mais sobre tipos de desafio.

Opcional: configuração do registro em log

Ative o registro em log na criação do aplicativo criando um retorno de chamada de registro em log, para que o SDK possa gerar logs.

import com.microsoft.identity.client.Logger

fun initialize(context: Context) {
        Logger.getInstance().setExternalLogger { tag, logLevel, message, containsPII ->
            Logs.append("$tag $logLevel $message")
        }
    }

Para configurar o agente, você precisa adicionar uma seção no arquivo de configuração: auth_config_native_auth.json

    //...
   { 
     "logging": { 
       "pii_enabled": false, 
       "log_level": "INFO", 
       "logcat_enabled": true 
     } 
   } 
    //...
  1. logcat_enabled: habilita a funcionalidade de registrar em log da biblioteca.
  2. pii_enabled: especifica se as mensagens que contém dados pessoais ou dados organizacionais são registradas. Quando definidos como false, os logs não contêm dados pessoais. Quando definidos como true, os logs podem conter dados pessoais.
  3. log_level: use-o para decidir qual nível de registro em log habilitar. O Android dá suporte aos seguintes níveis de log:
    1. ERROR
    2. WARNING
    3. INFO
    4. VERBOSE

Para obter mais informações sobre o registro em log da MSAL, consulte Registro em log na MSAL para Android.

Criar uma instância do SDK do MSAL de autenticação nativa

No método onCreate(), crie uma instância de MSAL para que o aplicativo possa executar a autenticação com seu locatário por meio da autenticação nativa. O método createNativeAuthPublicClientApplication() retorna uma instância chamada authClient. Passe o arquivo de configuração JSON que você criou anteriormente como um parâmetro.

    //...
    authClient = PublicClientApplication.createNativeAuthPublicClientApplication( 
        this, 
        R.raw.auth_config_native_auth 
    )
    //...

Seu código deve ser semelhante ao seguinte trecho:

    class MainActivity : AppCompatActivity() { 
        private lateinit var authClient: INativeAuthPublicClientApplication 
 
        override fun onCreate(savedInstanceState: Bundle?) { 
            super.onCreate(savedInstanceState) 
            setContentView(R.layout.activity_main) 
 
            authClient = PublicClientApplication.createNativeAuthPublicClientApplication( 
                this, 
                R.raw.auth_config_native_auth 
            ) 
            getAccountState() 
        } 
 
        private fun getAccountState() {
            CoroutineScope(Dispatchers.Main).launch {
                val accountResult = authClient.getCurrentAccount()
                when (accountResult) {
                    is GetAccountResult.AccountFound -> {
                        displaySignedInState(accountResult.resultValue)
                    }
                    is GetAccountResult.NoAccountFound -> {
                        displaySignedOutState()
                    }
                }
            }
        } 
 
        private fun displaySignedInState(accountResult: AccountState) { 
            val accountName = accountResult.getAccount().username 
            val textView: TextView = findViewById(R.id.accountText) 
            textView.text = "Cached account found: $accountName" 
        } 
 
        private fun displaySignedOutState() { 
            val textView: TextView = findViewById(R.id.accountText) 
            textView.text = "No cached account found" 
        } 
    } 
  • Recupere a conta armazenada em cache usandogetCurrentAccount(), que retorna um objeto, accountResult.
  • Se uma conta estiver em persistência, use GetAccountResult.AccountFound para exibir um estado conectado.
  • Caso contrário, use GetAccountResult.NoAccountFound para exibir um estado de saída.

Certifique-se de incluir as instruções de importação. O Android Studio deve incluir as instruções de importação para você automaticamente.

Próxima etapa