適用対象:
外部テナント (詳細)
このチュートリアルでは、ネイティブ認証を使用して Android モバイル アプリで電子メール ワンタイム パスコードまたはユーザー名 (電子メール) とパスワードを使用してユーザーをサインアップする方法について説明します。 また、サインアップ時にユーザー属性 (ユーザー名 (エイリアス) を含む) を収集し、エラーを処理する方法についても説明します。
このチュートリアルでは、次の操作を行います。
- メールのワンタイム パスコードまたはメール アドレスとパスワードの組み合わせを使用してユーザーを登録します。
- ユーザー名 (エイリアス) など、サインアップ時にユーザー属性を収集します。
- サインアップ エラーを処理します。
[前提条件]
- チュートリアル: ネイティブ認証用に Android アプリを準備するに関する記事の手順を完了します。
- サインアップ中にユーザ属性を収集する場合は、「サインアップとサインインのユーザー フローを作成するときにユーザー属性を構成します。
- サインアップ時にユーザー名 (エイリアス) を収集するには、テナントのサインアップ ユーザー フローで Username 組み込みユーザー属性を有効にします。
ユーザーをサインアップする
電子メールワンタイム パスコードまたはユーザー名 (電子メール) とパスワードを使用してユーザーをサインアップするには、ユーザーからメールを収集し、電子メールワンタイム パスコードを含む電子メールをユーザーに送信します。 ユーザーは、有効なメールのワンタイム パスコードを入力し、ユーザー名を検証します。
ユーザーをサインアップするには、次の操作を行う必要があります。
「ユーザーインターフェース (UI) を作成して、以下を行う:」
- ユーザーからメール アドレスを収集します。 ユーザーが有効なメール アドレスを入力していることを確認するために、入力に検証を追加します。
- ユーザー名 (メール アドレス) とパスワードでサインアップした場合、パスワードを収集します。
- アプリでエイリアス ベースのサインインがサポートされている場合は、ユーザー名 (エイリアス) を収集します。
- ユーザーからメールのワンタイム パスコードを収集します。
- 必要に応じて、ユーザー属性を収集します。
- ワンタイム パスコードを再送信します (推奨)。
- サインアップ フローを開始します。
アプリで、select イベントによって次のコード スニペットをトリガーするボタンを追加します。
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 } } }- SDK のインスタンス メソッド
signUp(parameters)を使用して、サインアップ フローを開始します。 - ユーザー名 (メール アドレス) とパスワードを使用してサインアップするには、
NativeAuthSignUpParametersクラスのインスタンスを作成し、ユーザー名とパスワードを割り当てます。 - サインアップ パラメーター
usernameは、ユーザーから収集した電子メール アドレスです。 - 最も一般的なシナリオでは、
signUp(parameters)は結果 (SignUpResult.CodeRequired) を返します。これは、SDK がアプリがユーザーのメール アドレスに送信された電子メール ワンタイム パスコードを送信することを想定していることを示します。 -
SignUpResult.CodeRequiredオブジェクトには、actionResult.nextStateを使用して取得できる新しい状態参照が含まれています。 - 新しい状態では、次の 2 つの新しいメソッドにアクセスできます。
-
submitCode()では、アプリによってユーザーから収集するメールのワンタイム パスコードを送信します。 -
resendCode()では、ユーザーがコードを受信しなかった場合にメールのワンタイム パスコードを再送信します。
-
-
submitCode()はSignUpResult.Completeを返しますが、これは、フローが完了し、ユーザーがサインアップされたことを示します。 -
signUp(parameters)は、エラーが発生したことを示すSignUpErrorを返すこともできます。
- SDK のインスタンス メソッド
サインアップ中にユーザー属性を収集する
メールのワンタイム パスコードを使用してユーザーをサインアップする場合でも、ユーザー名 (メール アドレス) とパスワードの組み合わせを使用して登録する場合でも、ユーザーのアカウントが作成される前にユーザー属性を収集できます。
NativeAuthSignUpParametersインスタンスは、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 には、ユーザー属性を作成するために使用するユーティリティ クラス
UserAttribute.Builderが用意されています。 たとえば、city および country ユーザー属性を送信するには、次のコード スニペットを使用してuserAttributes変数を構築します。val userAttributes = UserAttributes.Builder () .country(country) .city(city) .build()UserAttribute.Builderクラス内のメソッド名は、それらによって作成される、プログラム可能なユーザー属性名と同じです。 Android SDK 属性ビルダーの詳細を確認します。signUp(parameters)メソッドは、SignUpResult.AttributesRequiredを返して、Microsoft Entra がアカウントを作成する前に、アプリが 1 つ以上の必須属性を送信する必要があることを示すことができます。 これらの属性は、管理者によって Microsoft Entra 管理センターで必須のものとして構成されています。 Microsoft Entra では、オプションのユーザー属性を明示的に要求しません。SignUpResult.AttributesRequiredの結果には、requiredAttributesパラメーターが含まれています。requiredAttributesは、RequiredUserAttributeオブジェクトの一覧であり、アプリから送信される必要があるユーザー属性に関する詳細を含んでいます。actionResult is SignUpResult.AttributesRequiredを処理するには、次のコード スニペットを使用します。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 ) }
サインアップ時にユーザー名 (エイリアス) を収集する
ユーザー名 (エイリアス) は特殊なユーザー属性です。 市区町村や国などの他の属性と同様に、サインアップ時に収集します。 これらの属性とは異なり、ユーザーは後でエイリアスを使用してサインインできます。 エイリアス ("johndoe" など) を使用すると、ユーザーはメール アドレスよりも短く、よりわかりやすい方法でサインインできます。
ユーザー名 (エイリアス) は、ユーザー名 (電子メール) に置き換えられません。 サインアップ時に、アプリは常にプライマリ識別子としてユーザー名 (電子メール) を収集し、エイリアスを電子メールと共に属性として収集する必要があります。 サインイン時に、ユーザーは自分のユーザー名 (電子メール) またはユーザー名 (エイリアス) を使用してサインインすることを選択できます。
サインアップ ユーザー フローで Username 組み込みユーザー属性が有効になっている場合、SDK は、UserAttributes メソッドを使用して、他の属性に使用されるのと同じflatUsername() ビルダーを介してそれを受け入れます。 サインアップ呼び出しでユーザー名 (エイリアス) を直接渡すことができるため、ユーザーは別の属性に必要な手順を実行する必要はありません。
ユーザー名 (エイリアス) を収集するには、サインアップ UI のユーザー名の入力フィールドを電子メール フィールドと共に追加し、サインアップ呼び出しで属性としてエイリアスを渡します。
val email = binding.emailText.text.toString()
val password = binding.passwordText.text.toString()
val username = binding.usernameText.text.toString()
val attributes = UserAttributes.Builder()
.flatUsername(username)
.build()
CoroutineScope(Dispatchers.Main).launch {
val actionResult = authClient.signUpUsingPassword(
username = email,
password = password,
attributes = attributes
)
when (actionResult) {
is SignUpResult.CodeRequired -> {
// Navigate to code verification
navigateToCodeVerification(actionResult.nextState)
}
is SignUpUsingPasswordError -> {
handleSignUpError(actionResult)
}
}
}
電子メールワンタイム パスコード フロー (パスワードなし) の場合は、signUpの代わりに signUpUsingPassword を使用します。
val actionResult = authClient.signUp(
username = email,
attributes = attributes
)
サインアップ エラーを処理する
サインアップ中、すべてのアクションが成功するわけではありません。 たとえば、ユーザーが既に使用されているメール アドレスでサインアップしようとしたり、無効なメールのワンタイム パスコードを送信したりすることがあります。
サインアップの開始エラーを処理する
signUp() メソッドのエラーを処理するには、次のコード スニペットを使用します。
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)はSignUpErrorを返すことができます。SignUpErrorは、signUp()によって返されたアクションが失敗した結果を示し、新しい状態への参照は含まれません。actionResult is SignUpError場合、Microsoft Authentication Library (MSAL) Android SDK には、特定のエラーをさらに分析するためのユーティリティ メソッドが用意されています。- このメソッド
isUserAlreadyExists()は、アカウントの作成にユーザー名またはエイリアスが既に使用されているかどうかを確認します。 -
isInvalidAttributes()では、アプリから送信された 1 つまたは複数の属性が、データ型が間違っているなど、検証で失敗したかどうかを確認します。 これには、invalidAttributesパラメーターが含まれています。これは、アプリが送信したが検証に失敗したすべての属性の一覧です。 -
isInvalidPassword()は、パスワードが無効かどうかを確認します (パスワードがすべてのパスワードの複雑さの要件を満たしていない場合など)。 Microsoft Entra のパスワード ポリシーについての詳細を確認してください -
isInvalidUsername()は、ユーザーの電子メールが無効な場合など、ユーザー名が無効かどうかを確認します。 -
isBrowserRequired()は、認証フローを完了するためにブラウザー (Web フォールバック) が必要かどうかを確認します。 このシナリオは、認証フローを完了するのにネイティブ認証だけでは十分ではない場合に発生します。 たとえば、管理者は認証方法として電子メールとパスワードを構成しますが、アプリはチャレンジの種類として パスワード を送信できないか、サポートしていません。 このシナリオを処理するには、 Android アプリでの Web フォールバックのサポートに 関するページの手順を使用します。 -
isAuthNotSupported()は、Microsoft Entra でサポートされていないチャレンジ型 (oob または password 以外のチャレンジ型の値) をアプリが送信していないかどうかを確認します。 チャレンジ型の詳細を参照してください。
アプリの UI でわかりやすいメッセージを使用して、メール アドレスが既に使用されていることや一部の属性が無効であることをユーザーに通知します。
- このメソッド
無効な属性を示すエラーを処理するには、次のコード スニペットを使用します。
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) } //...
メールのワンタイムパスコード送信で発生したエラーを処理する
submitCode() メソッドのエラーを処理するには、次のコード スニペットを使用します。
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()はSubmitCodeErrorを返すことができます。isInvalidCode()メソッドを使用して、送信されたコードが無効であるなどの特定のエラーを確認します。 この場合、アクションを再実行するには、前の状態参照を使用する必要があります。新しいメールのワンタイム パスコードを取得するには、以下のコード スニペットを使用します。
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 ) }
必ず import ステートメントを含めます。 Android Studio では、自動的に import ステートメントが含められます。
アプリでユーザーをサインアップするために必要なすべての手順を完了しました。 アプリケーションをビルドして実行します。 すべてが正しく構成されている場合は、電子メールワンタイム パスコードまたは電子メールとパスワードを使用してユーザーをサインアップし、ユーザー名 (エイリアス) を含むユーザー属性を収集できる必要があります。
省略可能: サインアップ フロー後にサインインする
サインアップ フローが正常に完了したら、サインイン フローを開始せずにユーザーをサインインできます。 ユーザーがユーザー名 (エイリアス) でサインアップした場合は、メール アドレスまたはエイリアスを使用してサインインできます。 詳細については、「チュートリアル: Android でサインアップ後にユーザーをサインインさせる」の記事を参照してください。
次のステップ
チュートリアル: Android アプリで、メールのワンタイム パスコードを使用してサインインとサインアウトを追加する。