ネイティブ認証を使用してサンプル iOS (Swift) モバイル アプリでユーザーをサインインする

このガイドでは、Microsoft Entra 外部 ID を使用したサインアップ、サインイン、サインアウト、パスワード リセットのシナリオを示す iOS サンプル アプリケーションを実行する方法について説明します。

この記事では、次のことについて説明します。

  • 外部テナントにアプリケーションを登録する。
  • パブリック クライアントとネイティブ認証フローを有効にします。
  • ユーザー フローを外部テナントに作成する。
  • アプリケーションをユーザー フローに関連付けます。
  • 独自の外部テナントの詳細を使用するように、サンプルのネイティブ iOS モバイル アプリケーションを更新します。
  • サンプルのネイティブ iOS モバイル アプリケーションを実行してテストします。

前提条件

アプリケーションの登録

Microsoft Entra を使用してアプリケーションでユーザーをサインインできるようにするには、作成するアプリケーションを Microsoft Entra 外部 ID に認識させる必要があります。 アプリの登録によって、アプリと Microsoft Entra の間に信頼関係が確立されます。 アプリケーションを登録すると、外部 ID によって、アプリケーション (クライアント) ID と呼ばれる一意識別子が生成されます。これは、認証要求を作成するときにアプリを識別するために使用される値です。

Microsoft Entra 管理センターにアプリを登録する方法を次の手順に示します。

  1. アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。

  2. 複数のテナントにアクセスできる場合、上部のメニューの [設定] アイコン を使用し、[ディレクトリとサブスクリプション] メニューから外部テナントに切り替えます。

  3. [ID]>[アプリケーション]>[アプリの登録] を参照します。

  4. [+ 新規登録] を選択します。

  5. 表示される [アプリケーションの登録] ページで、次のようにします。

    1. アプリのユーザーに表示されるわかりやすいアプリケーションの [名前] を入力します (例: ciam-client-app)。
    2. [サポートされているアカウントの種類] で、 [この組織のディレクトリ内のアカウントのみ] を選択します。
  6. [登録] を選択します。

  7. 登録が成功すると、アプリケーションの [概要] ペインが表示されます。 アプリのソース コードで使用するアプリケーション (クライアント) ID を記録します。

パブリック クライアントとネイティブ認証フローの有効化

このアプリがパブリック クライアントであり、ネイティブ認証を使用できることを指定するには、パブリック クライアントとネイティブ認証フローを有効にします。

  1. アプリ登録ページから、パブリック クライアントとネイティブ認証フローを有効にしたいアプリ登録を選択します。
  2. [管理] で、 [認証] を選択します。
  3. [詳細設定] で、パブリック クライアント フローを許可します。
    1. [次のモバイルとデスクトップ フローを有効にする] で、[はい] を選択します。
    2. [ネイティブ認証を有効にする] で、[はい] を選択します。
  4. [保存] ボタンを選択します。
  1. [アプリの登録] ページで、作成したアプリケーション ("ciam-client-app" など) を選択して、その [概要] ページを開きます。

  2. [管理] の下にある [API のアクセス許可] を選択します。 構成済みアクセス許可一覧から、お使いのアプリケーションに User.Read アクセス許可が割り当てられています。 ただし、テナントが外部テナントであるため、コンシューマー ユーザー自身はこのアクセス許可に同意できません。 管理者は、テナント内のすべてのユーザーに代わってこのアクセス許可に同意する必要があります。

    1. [<ご使用のテナント名> に管理者の同意を与えます] を選択してから、[はい] を選択します。
    2. [最新の情報に更新] を選択し、両方のスコープの [状態] に "<ご使用のテナント名> に付与されました" と表示されていることを確認します。

ユーザー フローを作成する

以下の手順に従って、ユーザー フローを作成します。

  1. アプリケーション開発者以上として Microsoft Entra 管理センターにサインインします。

  2. 複数のテナントにアクセスできる場合は、外部テナントを含むディレクトリを使用してください。

    1. ツール バーの [ディレクトリ + サブスクリプション] アイコンを選択します。
    2. [ポータルの設定] | [ディレクトリ + サブスクリプション] ページの [ディレクトリ名] の一覧で外部テナント ディレクトリを見つけて、[切り替え] を選択します。
  3. サイドバー メニューで、[ID] を選択します。

  4. [外部 ID]>[ユーザー フロー] の順に選択します。

  5. [+ 新しいユーザー フロー] を選択します。

  6. [作成] ページで、次のようにします。

    1. ユーザー フローの [名前] ("SignInSignUpSample" など) を入力します。

    2. [ID プロバイダー] の一覧で、[メール アカウント] を選択します。 この ID プロバイダーを使用すると、ユーザーが自分のメール アドレスを使用してサインインまたはサインアップできます。

    3. [メール アカウント] で、2 つのオプションのいずれかを選択できます。 このチュートリアルでは、[メールのワンタイム パスコード] を選択します。

      • [Email with password] (メール アドレスとパスワード): 新しいユーザーは、サインイン名としてメール アドレスを、その最初の要素の資格情報としてパスワードを使用してサインアップおよびサインインできます。
      • [メールのワンタイム パスコード]: 新しいユーザーは、サインイン名としてメール アドレスを、資格情報の第一段階要素としてメールのワンタイム パスコードを使用してサインアップおよびサインインできます。 このオプションをユーザー フロー レベルで使用可能にするには、メールのワンタイム パスコード (OTP) をテナント レベルで有効にする必要があります ([すべての ID プロバイダー] を選択し、[メールのワンタイム パスコード] で、[構成済み] を選択してから [はい] を選択し、[保存] を選択します)。
    4. [ユーザー属性] で、サインアップ時にユーザーから収集する属性を選択できます。 このガイドでは、[国/地域][市区町村] を選択します。

  7. [作成] を選択します 新しいユーザー フローは [ユーザー フロー] の一覧に表示されます。 必要に応じて、ページを更新してください。

Web アプリケーションをユーザー フローに関連付ける

複数のアプリケーションをユーザー フローに関連付けることができますが、1 つのアプリケーションを関連付けることができるユーザー フローは 1 つだけです。 ユーザー フローを使用すると、特定のアプリケーション用のユーザー エクスペリエンスを構成できます。 たとえば、ユーザーにメール アドレスを使用してサインインまたはサインアップすることを要求するユーザー フローを構成できます。

  1. サイドバー メニューで、[ID] を選択します。

  2. [External Identities][User flows] (ユーザー フロー) の順に選択します。

  3. [ユーザー フロー] ページで、前に作成した [ユーザー フロー名] (SignInSignUpSample など) を選びます。

  4. [使用] で、[アプリケーション] を選択します。

  5. [アプリケーションの追加] をクリックします。

  6. 一覧からアプリケーション ("ciam-client-app" など) を選択するか、検索ボックスを使用してアプリケーションを見つけ、それを選択します。

  7. [選択] を選択します。

サンプルの iOS モバイル アプリケーションを複製する

  1. ターミナルを開き、コードを保持するディレクトリに移動します。

  2. 次のコマンドを実行して、GitHub から iOS モバイル アプリを複製します。

    git clone https://github.com/Azure-Samples/ms-identity-ciam-native-auth-ios-sample.git
    
  3. リポジトリが複製されたディレクトリに移動します。

    cd ms-identity-ciam-native-auth-ios-sample
    

サンプル iOS モバイル アプリケーションを構成する

  1. Xcode で、NativeAuthSampleApp.xcodeproj プロジェクトを開きます。

  2. NativeAuthSampleApp/Configuration.swift ファイルを開きます。

  3. 次のプレースホルダーを見つけます。

    • Enter_the_Application_Id_Here を、前に登録したアプリのアプリケーション (クライアント) ID に置き換えます。
    • Enter_the_Tenant_Subdomain_Here を、ディレクトリ (テナント) サブドメインに置き換えます。 たとえば、テナントのプライマリ ドメインが contoso.onmicrosoft.com の場合は、contoso を使用します。 テナントのサブドメイン名がない場合は、テナントの詳細を読み取る方法を確認してください

Note

ビルドするスキームとビルドした製品を実行する場所を必ず選択してください。 各スキームには、使用可能な宛先を表す実際のデバイスまたはシミュレートされたデバイスの一覧が含まれています。

サンプル iOS モバイル アプリケーションの実行とテスト

コードをビルドして実行するには、Xcode のメニューの [製品] から [実行]を選択します。 ビルドが成功すると、Xcode はシミュレーターでサンプル アプリを起動します。

iOS アプリでメールアドレスを入力するためのユーザー プロンプトのスクリーンショット。

このガイドでは、メール ワンタイム パスコードの使用状況をテストします。 有効なメール アドレスを入力し、[サインアップ] を選択し、送信コード画面を起動します。

iOS アプリでワンタイム パスコード (OTP) を入力するためのユーザー プロンプトのスクリーンショット。

前の画面でメール アドレスを入力すると、アプリケーションから確認コードが送信されます。 受信したコードを送信すると、アプリケーションによって前の画面に戻り、自動的にサインインします。

このサンプルでサポートされるその他のシナリオ

サンプル アプリでは、次のフローがサポートされています。

  • メール + パスワード は、パスワードを含むメールによるサインインまたはサインアップ フローを対象とします。
  • メール + パスワード サインアップ (ユーザー属性あり)では、メールとパスワードによるサインアップと、ユーザー属性の送信について説明します。
  • パスワード リセットには、セルフサービス パスワード リセット (SSPR) が含まれます。
  • 保護された API へのアクセス では、ユーザーが正常にサインアップまたはサインインしてアクセス トークンを取得した後に、保護された API を呼び出す方法について説明します。
  • Web ブラウザーへのフォールバックでは、ユーザーが何らかの理由でネイティブ認証を使用して認証を完了できない場合に、ブラウザー ベースの認証をフォールバック メカニズムとして使用する方法について説明します。

パスワード フローを使用してメールをテストする

このセクションでは、メールとパスワードを使用したフローをテストします。これには、メールとパスワードによるサインアップに、ユーザー属性や SSPR を組み合わせるなどのバリエーションが含まれます。

  1. ユーザー フローの作成」手順に従って、新しいユーザー フローを作成しますが、今回は認証方法として [メールとパスワード] を選択します。 ユーザー属性として [国/地域][市区町村] を構成する必要があります。 または、既存のユーザー フローを変更して、[メールとパスワード] を使用することもできます ([外部 ID]>[ユーザー フロー]>[SignInSignUpSample]>[ID プロバイダー]>[メールとパスワード]>[保存] を選択します)。

  2. アプリケーションを新しいユーザー フローに関連付ける」の手順に従って、新しいユーザー フローにアプリを追加します。

  3. サンプル アプリを実行し、省略記号メニュー (...) を選択して、その他のオプションを開きます。

  4. テストするシナリオ ([メール + パスワード][メール + パスワード サインアップ (ユーザー属性あり)] [パスワード リセット]など) を選択し、プロンプトに従います。 パスワードのリセットをテストするには、まずユーザーをサインアップし、テナント内のすべてのユーザーに対してメールワンタイム パスコードを有効にする必要があります。

保護された API フローの呼び出しテスト

ネイティブ認証を使用してサンプル iOS モバイル アプリで保護された Web API を呼び出す」の手順に従って、サンプル iOS モバイル アプリから保護された Web API を呼び出します。

次のステップ