次の方法で共有


チュートリアル: ネイティブ認証を使用して Android モバイル アプリでサインアップを追加する

このチュートリアルでは、ネイティブ認証を使用して Android モバイル アプリで、メールのワンタイム パスコードまたはメール アドレスとパスワードの組み合わせを使用してユーザーをサインアップし、ユーザー属性を収集する方法について説明します。

このチュートリアルでは、次の作業を行う方法について説明します。

  • メールのワンタイム パスコードまたはメール アドレスとパスワードの組み合わせを使用してユーザーを登録します。
  • サインアップ中にユーザー属性を収集します。
  • サインアップ エラーを処理します。

前提条件

ユーザーをサインアップする

メールのワンタイム パスコードまたはメール アドレスとパスワードの組み合わせを使用してユーザーをサインアップするには、ユーザーからメール アドレスを収集し、メールのワンタイム パスコードを含むメールをユーザーに送信します。 ユーザーは、有効なメールのワンタイム パスコードを入力し、ユーザー名を検証します。

ユーザーをサインアップするには、次の操作を行う必要があります。

  1. 以下にユーザー インターフェイス (UI) を作成します。

    • ユーザーからメール アドレスを収集します。 入力に検証を追加して、ユーザーが有効なメール アドレスを入力していることを確認します。
    • ユーザー名 (メール アドレス) とパスワードでサインアップした場合、パスワードを収集します。
    • ユーザーからメールのワンタイム パスコードを収集します。
    • 必要に応じて、ユーザー属性を収集します。
    • ワンタイム パスコードを再送信します (推奨)。
    • サインアップ フローを開始します。
  2. アプリで、select イベントによって次のコード スニペットをトリガーするボタンを追加します。

    CoroutineScope(Dispatchers.Main).launch {
        val actionResult = authClient.signUp(
            username = emailAddress
            //password = password, Pass 'password' param if you sign up with username (email) and password
        )
        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(username) を使用して、サインアップ フローを開始します。
      • ユーザー名 (メール アドレス) とパスワードを使用してサインアップするには、パスワード パラメーターを signUp 関数 (signUp(username, password)) に渡します。
    • メソッドのパラメーター (username) は、ユーザーから収集したメール アドレスです。
    • 最も一般的なシナリオでは、signUp(username) または signUp(username, password) によって結果 SignUpResult.CodeRequired が返されます。これは、ユーザーのメール アドレスに送信されたメールのワンタイム パスコードをアプリから送信することを SDK で想定していることを示します。
    • SignUpResult.CodeRequired オブジェクトには新しい状態参照が含まれており、actionResult.nextState を通じて取得できます。
    • 新しい状態により、次の 2 つの新しいメソッドにアクセスできるようになります。
      • submitCode() では、アプリによってユーザーから収集するメールのワンタイム パスコードを送信します。
      • resendCode() では、ユーザーがコードを受信しなかった場合にメールのワンタイム パスコードを再送信します。
    • submitCode()SignUpResult.Complete を返しますが、これは、フローが完了し、ユーザーがサインアップされたことを示します。
    • また、signUp(username) または signUp(username, password) は、エラーが発生したことを示す SignUpError を返すこともできます。

サインアップ中にユーザー属性を収集する

メールのワンタイム パスコードを使用してユーザーをサインアップする場合でも、ユーザー名 (メール アドレス) とパスワードの組み合わせを使用して登録する場合でも、ユーザーのアカウントが作成される前にユーザー属性を収集できます。

  • signUp() メソッドは attributes パラメーターを signUp(username, attributes) として受け入れます。

        CoroutineScope(Dispatchers.Main).launch {
            val actionResult = authClient.signUp(
                username = emailAddress,
                attributes = userAttributes
                //password = password, Pass 'password' param if you sign up with username (email) and password
            )
            //...
        }
    
  • Android SDK には、ユーザー属性を作成するために使用するユーティリティ クラス UserAttribute.Builder が用意されています。 たとえば、city および country ユーザー属性を送信するには、次のコード スニペットを使用して userAttributes 変数を構築します。

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

    UserAttribute.Builder クラス内のメソッド名は、それらによって作成される、プログラム可能なユーザー属性名と同じです。 Android SDK 属性ビルダーの詳細を確認します。

  • signUp(username, attributes) または signUp(username, attributes, password) メソッドは SignUpResult.AttributesRequired を返して、Microsoft Entra でアカウントを作成する前に、アプリから 1 つまたは複数の必須の属性が送信される必要があることを示すこともできます。 これらの属性は、管理者によって Microsoft Entra 管理センターで必須のものとして構成されています。 Microsoft Entra では、オプションのユーザー属性を明示的に要求しません。

  • SignUpResult.AttributesRequired の結果には、requiredAttributes パラメーターが含まれています。 requiredAttributes は、RequiredUserAttribute オブジェクトの一覧であり、アプリから送信される必要があるユーザー属性に関する詳細を含んでいます。 actionResult is SignUpResult.AttributesRequired を処理するには、次のコード スニペットを使用します。

    val actionResult = authClient.signUp(
        username = email,
        attributes = attributes
        //password = password, Pass 'password' param if you sign up with username (email) and password
    )
    if (actionResult is SignUpResult.AttributesRequired) {
            val requiredAttributes = actionResult.requiredAttributes 
            // Handle "attributes required" result 
            val nextState = actionResult.nextState
            nextState.submitAttributes(
                attributes = moreAttributes
            )
    }
    

サインアップ エラーを処理する

サインアップ中、すべてのアクションが成功するわけではありません。 たとえば、ユーザーが既に使用されているメール アドレスでサインアップしようとしたり、無効なメールのワンタイム パスコードを送信したりすることがあります。

サインアップの開始エラーを処理する

signUp() メソッドのエラーを処理するには、次のコード スニペットを使用します。

val actionResult = authClient.signUp(
    username = email
)
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(username, attributes) または signUp(username, password, attributes)SignUpError を返すことができます。

  • SignUpError は、signUp() によって返されたアクションが失敗した結果を示し、新しい状態への参照は含まれません。

  • actionResult is SignUpError の場合、MSAL Android SDK には、特定のエラーをさらに分析するのに使用できるユーティリティ メソッドが用意されています。

    • メソッド isUserAlreadyExists() では、アカウントの作成にユーザー名が既に使用されているかどうかを確認します。
    • isInvalidAttributes() では、アプリから送信された 1 つまたは複数の属性が、データ型が間違っているなど、検証で失敗したかどうかを確認します。 これには invalidAttributes パラメーターが含まれ、アプリから送信されたが、検証で失敗したすべての属性がリストされます。
    • isInvalidPassword() では、パスワードがパスワードの複雑さの要件をすべて満たしていない場合など、パスワードが無効であることを確認します。 Microsoft Entra のパスワード ポリシーについての詳細を確認してください
    • isInvalidUsername() では、ユーザーのメールが無効な場合など、ユーザー名が無効であることを確認します。
    • isBrowserRequired() では、認証フローを完了するためにブラウザー (Web フォールバック) が必要であるかどうかを確認します。 このシナリオは、認証フローを完了するのにネイティブ認証だけでは十分ではない場合に発生します。 たとえば、管理者は認証方法としてメール アドレスとパスワードを構成しても、アプリが password をチャレンジ型として送信できないか、単にそれをサポートしていない場合などです。 これが発生するシナリオを処理するには、Android アプリでの Web フォールバックのサポートに関する記事の手順を使用します。
    • isAuthNotSupported() は、Microsoft Entra でサポートされていないチャレンジ型 (oob または password 以外のチャレンジ型の値) をアプリが送信していないかどうかを確認します。 チャレンジ型の詳細を参照してください。

    アプリの UI でわかりやすいメッセージを使用して、メール アドレスが既に使用されていることや一部の属性が無効であることをユーザーに通知します。

  • 無効な属性を示すエラーを処理するには、次のコード スニペットを使用します。

    val actionResult = authClient.signUp(
        username = email,
        attributes = attributes
        //password = password, Pass 'password' param if you sign up with username (email) and password
    )
    if (actionResult is SignUpError && actionResult.isInvalidAttributes()) {
        val invalidAttributes = actionResult.invalidAttributes
        // Handle "invalid attributes" error, this time submit valid attributes
        authClient.signUp(
            username = emailAddress,
            attributes = resubmittedAttributes
            //password = password, Pass 'password' param if you sign up with username (email) and password
        )
    } 
    //...
    

メールのワンタイム パスコードの送信エラーを処理する

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 アプリで、メールのワンタイム パスコードを使用してサインインとサインアウトを追加する