Esercitazione: Aggiungere l'iscrizione in un'app per dispositivi mobili Android usando l'autenticazione nativa
Si applica a: tenant del personale
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
- Completare i passaggi descritti nell'articolo Esercitazione: Preparare l'app Android per l'autenticazione nativa.
- Per raccogliere gli attributi utente durante l'iscrizione, configurare gli attributi utente quando si creare il flusso utente di iscrizione e accesso.
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:
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.
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 tramiteactionResult.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()
restituisceSignUpResult.Complete
, che indica che il flusso è stato completato e che l'utente è stato registrato. - Il
signUp(parameters)
può restituire ancheSignUpError
per indicare che si è verificato un errore.
- Usare il metodo di istanza dell'SDK
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 parametroattributes
: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 variabileuserAttributes
.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ò restituireSignUpResult.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 parametrorequiredAttributes
.requiredAttributes
è un elenco di oggettiRequiredUserAttribute
che contiene dettagli sugli attributi utente che l'app deve inviare. Per gestireactionResult 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ò restituireSignUpError
.SignUpError
indica un risultato dell'azione non riuscita restituito dasignUp()
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 parametroinvalidAttributes
, 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.
- Il metodo
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ò restituireSubmitCodeError
.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.