Condividi tramite


Esercitazione: Aggiungere l'iscrizione in un'app per dispositivi mobili Android usando l'autenticazione nativa

Si applica a: cerchio bianco con un simbolo X grigio. tenant del personale cerchio verde con un simbolo di segno di spunta bianco. tenant esterni (scopri di più)

Questa esercitazione illustra come iscrivere un utente usando il passcode monouso o il nome utente (indirizzo di posta elettronica) e la password e raccogliere gli attributi utente nell'app per dispositivi mobili Android usando l'autenticazione nativa.

In questa esercitazione si apprenderà come:

  • Iscriversi a un utente usando il passcode monouso o il nome utente (indirizzo di posta elettronica) e la password.
  • Raccogliere gli attributi dell'utente durante l'iscrizione.
  • Gestire gli errori di iscrizione.

Prerequisiti

Iscriversi a un utente

Per iscriversi a un utente usando il passcode monouso o il nome utente (indirizzo di posta elettronica) e la password, si raccoglie un messaggio di posta elettronica dall'utente, quindi si invia un messaggio di posta elettronica contenente un passcode monouso all'utente. L'utente immette un passcode monouso di posta elettronica valido per convalidare il proprio nome utente.

Per iscriversi a un utente, è necessario:

  1. Creare un'interfaccia utente per:

    • Raccogliere un messaggio di posta elettronica dall'utente. Aggiungere la convalida agli input per assicurarsi che l'utente immetta un indirizzo di posta elettronica valido.
    • Raccogliere una password se si effettua l'iscrizione con il nome utente (indirizzo di posta elettronica) e la password.
    • Raccogliere un passcode monouso tramite posta elettronica dall'utente.
    • Se necessario, raccogliere gli attributi utente.
    • Inviare nuovamente il passcode monouso (scelta consigliata).
    • Avviare il flusso di iscrizione.
  2. Nell'app aggiungere un pulsante, il cui evento select attiva il frammento di codice seguente:

    CoroutineScope(Dispatchers.Main).launch {
         val parameters = NativeAuthSignUpParameters(username = email)
         // Assign 'password' param if you sign in with username (email) and password
         // parameters.password = password
         val actionResult: SignUpResult = authClient.signUp(parameters)
    
         if (actionResult is SignUpResult.CodeRequired) {
             val nextState = actionResult.nextState
             val submitCodeActionResult = nextState.submitCode(
                code = code
             )
             if (submitCodeActionResult is SignUpResult.Complete) {
                // Handle sign up success
             }
        }
    }
    
    • Usare il metodo di istanza dell'SDK signUp(parameters) per avviare il flusso di iscrizione.
    • Per iscriversi usando nome utente (indirizzo di posta elettronica) e password, creare un'istanza della classe NativeAuthSignUpParameters e assegnare il nome utente e la password.
    • Il parametro di iscrizione, username, è l'indirizzo di posta elettronica raccolto dall'utente.
    • Nello scenario più comune, il signUp(parameters) restituisce un risultato, SignUpResult.CodeRequired, che indica che l'SDK prevede che l'app invii il passcode monouso di posta elettronica inviato all'indirizzo di posta elettronica dell'utente.
    • L'oggetto SignUpResult.CodeRequired contiene un nuovo riferimento di stato, che è possibile recuperare tramite actionResult.nextState.
    • Il nuovo stato consente di accedere a due nuovi metodi:
      • submitCode() invia il passcode monouso di posta elettronica che l'app raccoglie dall'utente.
      • resendCode() invia nuovamente il passcode monouso tramite posta elettronica se l'utente non riceve il codice.
    • Il submitCode() restituisce SignUpResult.Complete, che indica che il flusso è stato completato e che l'utente è stato registrato.
    • Il signUp(parameters) può restituire anche SignUpError per indicare che si è verificato un errore.

Raccogliere le informazioni degli utenti durante l'iscrizione

Se si effettua l'iscrizione a un utente usando il passcode monouso o il nome utente (indirizzo di posta elettronica) e la password, è possibile raccogliere gli attributi utente prima che venga creato l'account di un utente:

  • L'istanza di NativeAuthSignUpParameters accetta un parametro attributes:

        CoroutineScope(Dispatchers.Main).launch {
            val parameters = NativeAuthSignUpParameters(username = email)
            // Assign 'password' param if you sign in with username (email) and password
            // parameters.password = password
            parameters.attributes = userAttributes
            val actionResult: SignUpResult = authClient.signUp(parameters)
            //...
        }
    
  • Android SDK fornisce una classe di utilità UserAttribute.Builder che si usa per creare attributi utente. Ad esempio, per inviare la città e il paese come attributi utente, usare il frammento di codice seguente per compilare la variabile userAttributes.

         val userAttributes = UserAttributes.Builder ()
        .country(country) 
        .city(city) 
        .build()   
    

    I nomi dei metodi nella classe UserAttribute.Builder sono uguali ai nomi programmabili degli attributi utente compilati. Altre informazioni su Generatore di attributi di Android SDK.

  • Il metodo signUp(parameters) può restituire SignUpResult.AttributesRequired per indicare che l'app deve inviare uno o più attributi obbligatori prima che Microsoft Entra crei un account. Questi attributi vengono configurati dall'amministratore come obbligatori nell'interfaccia di amministrazione di Microsoft Entra. Microsoft Entra non richiede esplicitamente gli attributi utente facoltativi.

  • Il risultato SignUpResult.AttributesRequired contiene un parametro requiredAttributes. requiredAttributes è un elenco di oggetti RequiredUserAttribute che contiene dettagli sugli attributi utente che l'app deve inviare. Per gestire actionResult is SignUpResult.AttributesRequired, usare il frammento di codice seguente:

    val parameters = NativeAuthSignUpParameters(username = email)
    // Assign 'password' param if you sign in with username (email) and password
    // parameters.password = password
    parameters.attributes = userAttributes
    val actionResult: SignUpResult = authClient.signUp(parameters)
    
    if (actionResult is SignUpResult.AttributesRequired) {
            val requiredAttributes = actionResult.requiredAttributes 
            // Handle "attributes required" result 
            val nextState = actionResult.nextState
            nextState.submitAttributes(
                attributes = moreAttributes
            )
    }
    

Gestire gli errori di iscrizione

Durante l'iscrizione, non tutte le azioni hanno esito positivo. Ad esempio, l'utente potrebbe tentare di iscriversi con un indirizzo di posta elettronica già usato o inviare un passcode monouso di posta elettronica non valido.

Gestire l'errore di iscrizione iniziale

Per gestire gli errori per il metodo signUp(), usare il frammento di codice seguente:

 val parameters = NativeAuthSignUpParameters(username = email)
 // Assign 'password' param if you sign in with username (email) and password
 // parameters.password = password
val actionResult: SignUpResult = authClient.signUp(parameters)

if (actionResult is SignUpResult.CodeRequired) {
    // Next step: submit code
} else if (actionResult is SignUpError) {
     when {
         actionResult.isUserAlreadyExists() -> {
             // Handle "user already exists" error
         }
         else -> {
             // Handle other errors
         }
     }
}
  • signUp(parameters) può restituire SignUpError.

  • SignUpError indica un risultato dell'azione non riuscita restituito da signUp() e non includerà un riferimento al nuovo stato.

  • Se actionResult is SignUpError, MSAL Android SDK fornisce metodi di utilità per consentire di analizzare ulteriormente gli errori specifici:

    • Il metodo isUserAlreadyExists() controlla se il nome utente è già stato usato per creare un account.
    • isInvalidAttributes() controlla se uno o più attributi inviati dall'app hanno avuto esito negativo, ad esempio un tipo di dati errato. Contiene un parametro invalidAttributes, ovvero un elenco di tutti gli attributi inviati dalle app, ma la convalida non è riuscita.
    • isInvalidPassword() verificare che la password non sia valida, ad esempio quando la password non soddisfa tutti i requisiti di complessità delle password. Scopri di più sui criteri delle password di Microsoft Entra
    • isInvalidUsername() verificare che il nome utente non sia valido, ad esempio quando il messaggio di posta elettronica dell'utente non è valido.
    • isBrowserRequired() verifica la necessità di un browser (fallback Web) per completare il flusso di autenticazione. Questo scenario si verifica quando l'autenticazione nativa non è sufficiente per completare il flusso di autenticazione. Ad esempio, un amministratore configura la posta elettronica e la password come metodo di autenticazione, ma l'app non riesce a inviare password come tipo di verifica o semplicemente non la supporta. Usare la procedura descritta in Supportare il fallback Web nell'app Android per gestire lo scenario in cui si verifica.
    • isAuthNotSupported() controlla se l'app invia un tipo di verifica non supportato da Microsoft Entra, cioè un valore del tipo di verifica diverso da oob o password. Scopri di più sui tipi di sfida .

    Notifica all'utente che il messaggio di posta elettronica è già in uso o alcuni attributi non sono validi usando un messaggio descrittivo nell'interfaccia utente dell'app.

  • Per gestire l'errore degli attributi non validi, usare il frammento di codice seguente:

    val parameters = NativeAuthSignUpParameters(username = email)
    // Assign 'password' param if you sign in with username (email) and password
    // parameters.password = password
    parameters.attributes = userAttributes
    val actionResult: SignUpResult = authClient.signUp(parameters)
    
    if (actionResult is SignUpError && actionResult.isInvalidAttributes()) {
        val invalidAttributes = actionResult.invalidAttributes
    
        // Handle "invalid attributes" error, this time submit valid attributes
        val parameters = NativeAuthSignUpParameters(username = email)
        // Assign 'password' param if you sign in with username (email) and password
        // parameters.password = password
        parameters.attributes = userAttributes
        authClient.signUp(parameters)
    } 
    //...
    

Gestire l'errore di invio del passcode monouso tramite posta elettronica

Per gestire gli errori per il metodo submitCode(), usare il frammento di codice seguente:

val submitCodeActionResult = nextState.submitCode(
    code = code
)
if (submitCodeActionResult is SignUpResult.Complete) {
    // Sign up flow complete, handle success state.
} else if (submitCodeActionResult is SubmitCodeError) {
    // Handle errors under SubmitCodeError
     when {
         submitCodeActionResult.isInvalidCode() -> {
             // Handle "code invalid" error
         }
         else -> {
             // Handle other errors
         }
     }
}
  • submitCode() può restituire SubmitCodeError.

  • Usare il metodo isInvalidCode() per verificare la presenza dell'errore specifico, ad esempio il codice inviato non è valido. In questo caso, il riferimento allo stato precedente deve essere usato per riperformare l'azione.

  • Per recuperare un nuovo passcode monouso tramite posta elettronica, usare il frammento di codice seguente:

    val submitCodeActionResult = nextState.submitCode(
        code = code
    )
    if (submitCodeActionResult is SubmitCodeError && submitCodeActionResult.isInvalidCode()) {
        // Inform the user that the submitted code was incorrect or invalid and ask for a new code to be supplied
        val newCode = retrieveNewCode()
        nextState.submitCode(
            code = newCode
        )
    }
    

Assicurati di includere le istruzioni di importazione. Android Studio dovrebbe includere automaticamente le istruzioni di importazione per te.

Sono stati completati tutti i passaggi necessari per registrare correttamente un utente nell'app. Compilare ed eseguire l'applicazione. Se tutto va bene, dovrebbe essere possibile registrare correttamente l'utente utilizzando un passcode monouso inviato via email o un'email e una password.

Facoltativo: accedere dopo un flusso di iscrizione

Dopo un flusso di iscrizione riuscito, è possibile accedere a un utente senza avviare un flusso di accesso. Per ulteriori informazioni, consultare l'articolo Tutorial: accesso dell'utente dopo l'iscrizione in Android.

Passaggi successivi

Esercitazione: Aggiungere l'accesso e la disconnessione con codice temporaneo via email nell'app Android.