> ## Documentation Index
> Fetch the complete documentation index at: https://translations.mintlify.site/llms.txt
> Use this file to discover all available pages before exploring further.

# .NET Android & iOS アプリケーションにログインを追加する

export const HowToSchema = () => <script type="application/ld+json">
    {'{"@context":"https://schema.org","@type":"HowTo"}'}
  </script>;

<HowToSchema />

<Accordion title="AI を使って Auth0 を統合" icon="microchip-ai" iconType="solid" defaultOpen>
  Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使えば、[Agent Skills](https://agentskills.io/home) を使って数分で Auth0 認証を自動的に追加できます。

  **インストール:**

  ```bash theme={null}
  npx skills add auth0/agent-skills --skill auth0
  ```

  **続けて、AI アシスタントに次のように依頼します:**

  ```text theme={null}
  Add Auth0 authentication to my .NET Android & iOS app
  ```

  AI アシスタントが、Auth0 アプリケーションの作成、資格情報の取得、Auth0 OidcClient SDK のインストール、プラットフォーム固有の設定、ログイン／ログアウト フローの実装を自動で行います。[Agent Skills の完全なドキュメント →](/docs/ja-jp/quickstart/agent-skills)
</Accordion>

<div id="get-started">
  ## はじめに
</div>

<Steps>
  <Step title=".NET の新しいプロジェクトを作成する" stepNumber={1}>
    この Quickstart 用に、新しい .NET MAUI または .NET Android/iOS プロジェクトを作成します。

    <Tabs>
      <Tab title=".NET MAUI">
        **Visual Studio 2022 以降の場合:**

        1. **ファイル** → **新規** → **プロジェクト**
        2. **.NET MAUI App** テンプレートを選択します
        3. プロジェクトを設定します。
           * **プロジェクト名**: `Auth0MauiSample`
           * **場所**: 任意の場所を選択します
           * **フレームワーク**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>

      <Tab title=".NET Android">
        **Visual Studio 2022 以降の場合:**

        1. **ファイル** → **新規** → **プロジェクト**
        2. **Android App (.NET)** テンプレートを選択します
        3. プロジェクトを設定します。
           * **プロジェクト名**: `Auth0AndroidSample`
           * **フレームワーク**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>

      <Tab title=".NET iOS">
        **Visual Studio 2022 (Mac) または Visual Studio for Mac の場合:**

        1. **ファイル** → **新規** → **プロジェクト**
        2. **iOS App (.NET)** テンプレートを選択します
        3. プロジェクトを設定します。
           * **プロジェクト名**: `Auth0iOSSample`
           * **フレームワーク**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>
    </Tabs>

    <Info>
      この Quickstart では、Xamarin.Android と Xamarin.iOS の次世代である .NET Android と .NET iOS を対象としています。現在も Xamarin を使用している場合でも、連携方法は同じで SDK にも互換性があるため、このガイドに沿って進めることができます。
    </Info>
  </Step>

  <Step title="Auth0 SDK をインストールする" stepNumber={2}>
    Auth0 OIDC Client SDK をプロジェクトに追加します。

    <Tabs>
      <Tab title="Package Manager Console">
        Package Manager Console (**View** → **Other Windows** → **Package Manager Console**) を開き、適切なパッケージをインストールします。

        **.NET Android の場合:**

        ```bash Package Manager Console theme={null}
        Install-Package Auth0.OidcClient.AndroidX
        ```

        **.NET iOS の場合:**

        ```bash Package Manager Console theme={null}
        Install-Package Auth0.OidcClient.iOS
        ```

        **.NET MAUI (両方のプラットフォーム) の場合:**

        ```bash Package Manager Console theme={null}
        Install-Package Auth0.OidcClient.MAUI
        ```
      </Tab>

      <Tab title="Visual Studio for Mac">
        1. **Solution Pad** で **Packages** フォルダーを Ctrl+クリック (または右クリック) します
        2. **Add Packages...** を選択します
        3. 以下を検索します。
           * Android の場合: `Auth0.OidcClient.AndroidX`
           * iOS の場合: `Auth0.OidcClient.iOS`
           * MAUI プロジェクトの場合: `Auth0.OidcClient.MAUI`
        4. パッケージを選択し、**Add Package** をクリックします
      </Tab>

      <Tab title=".NET CLI">
        プロジェクトのディレクトリで、次のコマンドを実行します。

        **.NET Android の場合:**

        ```bash Terminal theme={null}
        dotnet add package Auth0.OidcClient.AndroidX
        ```

        **.NET iOS の場合:**

        ```bash Terminal theme={null}
        dotnet add package Auth0.OidcClient.iOS
        ```

        **.NET MAUI の場合:**

        ```bash Terminal theme={null}
        dotnet add package Auth0.OidcClient.MAUI
        ```
      </Tab>
    </Tabs>

    <Tip>
      Auth0 OIDC Client SDK は、OAuth 2.0 と OIDC のプロトコルに関する複雑な処理をすべて担い、authentication のためのシンプルな API を提供します。
    </Tip>
  </Step>

  <Step title="Auth0 App を設定する" stepNumber={3}>
    Auth0 テナントに新しいアプリケーションを作成し、モバイル向けに設定します。

    1. [Auth0 Dashboard](https://manage.auth0.com/dashboard/) に移動します
    2. **Applications** → **Applications** → **Create Application** をクリックします
    3. アプリの名前を入力し、アプリケーションタイプとして **Native** を選択して、**Create** をクリックします
    4. アプリケーションの詳細ページで **設定** タブに切り替えます
    5. **Domain** と **Client ID** を控えます。次の手順で使用します

    **コールバック URL を設定する:**

    **設定** タブで、次の URL を追加します。

    **Allowed Callback URLs:**

    <Tabs>
      <Tab title="Android">
        ```
        YOUR_ANDROID_PACKAGE_NAME://{yourDomain}/android/YOUR_ANDROID_PACKAGE_NAME/callback
        ```

        置き換える箇所:

        * `YOUR_ANDROID_PACKAGE_NAME` はアプリのパッケージ名に置き換えます (例: `com.mycompany.myapp`)
        * `{yourDomain}` は Auth0 のドメインに置き換えます (例: `dev-abc123.us.auth0.com`)

        例: `com.mycompany.myapp://dev-abc123.us.auth0.com/android/com.mycompany.myapp/callback`
      </Tab>

      <Tab title="iOS">
        ```
        YOUR_BUNDLE_IDENTIFIER://{yourDomain}/ios/YOUR_BUNDLE_IDENTIFIER/callback
        ```

        置き換える箇所:

        * `YOUR_BUNDLE_IDENTIFIER` はアプリのバンドル ID に置き換えます (例: `com.mycompany.myapp`)
        * `{yourDomain}` は Auth0 のドメインに置き換えます (例: `dev-abc123.us.auth0.com`)

        例: `com.mycompany.myapp://dev-abc123.us.auth0.com/ios/com.mycompany.myapp/callback`
      </Tab>
    </Tabs>

    **Allowed Logout URLs:**

    コールバック URL と同じ URL を使用します。

    <Warning>
      コールバック URL とログアウト URL は **小文字** で指定してください。一致しない URL を使用すると、認証は失敗します。
    </Warning>

    <Info>
      **Allowed Callback URLs** はセキュリティ上重要です。これにより、認証後にユーザーを安全にアプリケーションへ戻せます。一致する URL がない場合、ログインプロセスは失敗します。

      **Allowed Logout URLs** を設定すると、ユーザーのサインアウト時に Auth0 のページに残すことなく、アプリへリダイレクトできます。
    </Info>
  </Step>

  <Step title="Auth0 クライアントを初期化する" stepNumber={4}>
    Auth0 と通信するために、`Auth0Client` インスタンスを作成します。

    <Tabs>
      <Tab title="Android - MainActivity">
        ```cs MainActivity.cs lines theme={null}
        using Auth0.OidcClient;
        using Android.App;
        using Android.Content;

        [Activity(Label = "Auth0Sample", MainLauncher = true, Icon = "@drawable/icon",
            LaunchMode = LaunchMode.SingleTask)]
        [IntentFilter(
            new[] { Intent.ActionView },
            Categories = new[] { Intent.CategoryDefault, Intent.CategoryBrowsable },
            DataScheme = "YOUR_ANDROID_PACKAGE_NAME",
            DataHost = "{yourDomain}",
            DataPathPrefix = "/android/YOUR_ANDROID_PACKAGE_NAME/callback")]
        public class MainActivity : Activity
        {
            private Auth0Client auth0Client;

            protected override void OnCreate(Bundle savedInstanceState)
            {
                base.OnCreate(savedInstanceState);

                // Auth0 クライアントを初期化
                auth0Client = new Auth0Client(new Auth0ClientOptions
                {
                    Domain = "{yourDomain}",
                    ClientId = "{yourClientId}"
                }, this);
            }

            protected override async void OnNewIntent(Intent intent)
            {
                base.OnNewIntent(intent);
                Auth0.OidcClient.ActivityMediator.Instance.Send(intent.DataString);
            }
        }
        ```

        <Warning>
          `YOUR_ANDROID_PACKAGE_NAME`、`{yourDomain}`、`{yourClientId}` は実際の値に置き換えてください。`DataScheme`、`DataHost`、`DataPathPrefix` 内のテキストはすべて**小文字**にしてください。
        </Warning>

        <Info>
          `IntentFilter` は、アプリがコールバック URL を処理できるよう登録するためのものです。`LaunchMode.SingleTask` を指定することで、コールバック時に Android が新しい activity インスタンスを作成しないようにします。
        </Info>
      </Tab>

      <Tab title="iOS - AppDelegate">
        まず、`Info.plist` に URL スキームを登録します。

        ```xml Info.plist lines theme={null}
        <key>CFBundleURLTypes</key>
        <array>
            <dict>
                <key>CFBundleTypeRole</key>
                <string>None</string>
                <key>CFBundleURLName</key>
                <string>Auth0</string>
                <key>CFBundleURLSchemes</key>
                <array>
                    <string>YOUR_BUNDLE_IDENTIFIER</string>
                </array>
            </dict>
        </array>
        ```

        次に、`AppDelegate.cs` を設定します。

        ```cs AppDelegate.cs lines theme={null}
        using Auth0.OidcClient;
        using Foundation;
        using UIKit;

        [Register("AppDelegate")]
        public class AppDelegate : UIApplicationDelegate
        {
            private Auth0Client auth0Client;

            public override bool FinishedLaunching(UIApplication application, NSDictionary launchOptions)
            {
                // Auth0 クライアントを初期化
                auth0Client = new Auth0Client(new Auth0ClientOptions
                {
                    Domain = "{yourDomain}",
                    ClientId = "{yourClientId}"
                });

                return true;
            }

            public override bool OpenUrl(UIApplication application, NSUrl url,
                string sourceApplication, NSObject annotation)
            {
                ActivityMediator.Instance.Send(url.AbsoluteString);
                return true;
            }
        }
        ```

        <Warning>
          `YOUR_BUNDLE_IDENTIFIER`、`{yourDomain}`、`{yourClientId}` は実際の値に置き換えてください。
        </Warning>
      </Tab>
    </Tabs>

    <Tip>
      保守性を高めるため、Auth0 domain と client ID はハードコードせず、設定ファイルまたはアプリの設定に保存してください。
    </Tip>
  </Step>

  <Step title="Implement Login と Logout" stepNumber={5}>
    ユーザー認証を行うためのメソッドを追加します。

    **Implement Login:**

    ```cs Authentication.cs lines theme={null}
    public async Task LoginAsync()
    {
        var loginResult = await auth0Client.LoginAsync();

        if (!loginResult.IsError)
        {
            // 認証成功
            var accessToken = loginResult.AccessToken;
            var idToken = loginResult.IdentityToken;
            var user = loginResult.User;

            // 資格情報を保存してUIを更新
            Console.WriteLine($"Logged in as: {user.FindFirst("name")?.Value}");
        }
        else
        {
            // 認証エラーを処理
            Console.WriteLine($"Login error: {loginResult.Error}");
        }
    }
    ```

    **Implementのログアウト:**

    ```cs Authentication.cs lines theme={null}
    public async Task LogoutAsync()
    {
        var logoutResult = await auth0Client.LogoutAsync();

        if (logoutResult == BrowserResultType.Success)
        {
            // 保存された資格情報をクリア
            // UIをログアウト状態に更新
            Console.WriteLine("Logged out successfully");
        }
    }
    ```

    <Info>
      `LoginAsync()` メソッドは、Auth0 の Universal Login ページを表示するために、システムブラウザー (Android では Chrome Custom Tabs) を起動します。authentication の完了後、ユーザーは callback URL を介してアプリにリダイレクトされます。
    </Info>

    <Tip>
      これらのメソッドを MainActivity (Android) または ViewController (iOS) に追加し、ユーザーが Login/Logout ボタンをタップしたときに呼び出します。
    </Tip>
  </Step>

  <Step title="アプリを実行" stepNumber={6}>
    アプリケーションをビルドして実行します。

    <Tabs>
      <Tab title="Visual Studio (Windows)">
        **Android の場合:**

        1. デバイスのドロップダウンから Android エミュレーターまたは接続済みのデバイスを選択します
        2. **F5** キーを押すか、**Run** ボタンをクリックします
        3. アプリがビルド、デプロイされ、起動します

        **iOS の場合 (Mac ビルドホストが必要) :**

        1. Mac ビルドホストに接続します
        2. デバイスのドロップダウンから iOS シミュレーターまたはデバイスを選択します
        3. **F5** キーを押すか、**Run** ボタンをクリックします
      </Tab>

      <Tab title="Visual Studio for Mac">
        1. デバイスのドロップダウンからターゲット プラットフォーム (Android/iOS) を選択します
        2. エミュレーターまたはシミュレーター、もしくは接続済みのデバイスを選択します
        3. **⌘+Return** キーを押すか、**Run** ボタンをクリックします
        4. アプリがビルドされて起動します
      </Tab>

      <Tab title=".NET CLI">
        **Android の場合:**

        ```bash Terminal theme={null}
        dotnet build -f net8.0-android
        dotnet run -f net8.0-android
        ```

        **iOS の場合:**

        ```bash Terminal theme={null}
        dotnet build -f net8.0-ios
        dotnet run -f net8.0-ios
        ```
      </Tab>
    </Tabs>

    **想定されるフロー:**

    1. Login ボタンが表示された状態でアプリが起動します
    2. **Log In** をタップ → ブラウザーまたは Chrome Custom Tab が開く → 認証を完了します
    3. 自動的にアプリにリダイレクトされます
    4. ユーザーの認証が正常に完了します

    <Tip>
      初回実行時には、認証のためにブラウザーを開いてよいか iOS から確認を求められることがあります。これは正常で、想定された動作です。
    </Tip>
  </Step>
</Steps>

<Check>
  **チェックポイント**

  これで、.NET Android または iOS のアプリケーションで、Auth0 login を問題なく利用できるようになりました。アプリケーションは安全な認証のためにシステムブラウザーを使用し、コールバックフローも自動的に処理します。
</Check>

***

<div id="access-user-information">
  ## ユーザー情報にアクセスする
</div>

認証に成功すると、ログイン結果からユーザー情報にアクセスできます。

<div id="authentication-result">
  ### 認証結果
</div>

`LoginAsync()` メソッドは、以下を含む `LoginResult` オブジェクトを返します。

```cs UserInfo.cs lines theme={null}
var loginResult = await auth0Client.LoginAsync();

if (!loginResult.IsError)
{
    // アクセストークン
    var accessToken = loginResult.AccessToken;
    var idToken = loginResult.IdentityToken;
    var refreshToken = loginResult.RefreshToken;

    // ユーザーのクレームを取得する
    var user = loginResult.User;
    var name = user.FindFirst("name")?.Value;
    var email = user.FindFirst("email")?.Value;
    var picture = user.FindFirst("picture")?.Value;

    Console.WriteLine($"Name: {name}");
    Console.WriteLine($"Email: {email}");
}
```

<div id="iterate-through-all-claims">
  ### すべてのクレームを確認する
</div>

利用可能なすべてのユーザー情報を確認するには:

```cs UserClaims.cs lines theme={null}
if (!loginResult.IsError)
{
    foreach (var claim in loginResult.User.Claims)
    {
        Console.WriteLine($"{claim.Type}: {claim.Value}");
    }
}
```

<Info>
  返されるクレームの内容は、リクエストしたスコープによって異なります。詳しくは、Auth0 OIDC Client のドキュメントの [スコープの使用](https://auth0.github.io/auth0-oidc-client-net/documentation/advanced-scenarios/scopes.html) を参照してください。
</Info>

<div id="request-custom-scopes">
  ### カスタムスコープをリクエストする
</div>

追加のユーザー情報を取得するには、Auth0Clientの作成時にスコープを指定します:

```cs CustomScopes.cs lines theme={null}
var auth0Client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Scope = "openid profile email offline_access read:posts"
});
```

***

<div id="troubleshooting-advanced">
  ## トラブルシューティングと Advanced
</div>

<Accordion title="よくある問題と解決策">
  ### ブラウザーからアプリにリダイレクトされない

  **解決策:**

  1. Auth0 Dashboard のコールバック URL が、アプリのパッケージ名またはバンドル識別子と完全に一致していることを確認します
  2. コールバック URL が **小文字** になっていることを確認します
  3. `DataScheme`、`DataHost`、`DataPathPrefix` (Android) または URL スキーム (iOS) が設定内容と一致していることを確認します
  4. プロジェクトをクリーンし、再ビルドします

  ### "Invalid Callback URL" エラーで認証に失敗する

  **修正方法:**

  * Auth0 Dashboard のコールバック URL が次の形式と一致していることを再確認します:
    * Android: `packagename://yourdomain/android/packagename/callback`
    * iOS: `bundleidentifier://yourdomain/ios/bundleidentifier/callback`
  * URL が小文字になっていることを確認します
  * コード内の Domain が Auth0 Dashboard の Domain と一致していることを確認します

  ### LoginAsync() が応答しない、または完了しない

  **解決策:**

  * Intent filter (Android) または URL スキーム (iOS) が正しく設定されていることを確認します
  * `OnNewIntent()` (Android) または `OpenUrl()` (iOS) から `ActivityMediator` が呼び出されていることを確認します
  * アプリからシステムブラウザーを開けることを確認します
  * ネットワーク接続を確認します

  ### エラー: "Default App must use Token Endpoint Authentication Method 'None'"

  **修正方法:**

  1. Auth0 Dashboard の Auth0 アプリケーションの設定に移動します
  2. **Application Properties** までスクロールします
  3. **Application Type** を **Native** に設定します
  4. **Token Endpoint Authentication Method** を **None** に設定します
  5. **変更を保存** をクリックします

  ### iOS: ブラウザーが開かない

  **解決策:**

  * `Info.plist` に正しい URL スキーム設定が含まれていることを確認します
  * `OpenUrl()` が `AppDelegate` に実装されていることを確認します
  * iOS のデプロイ対象が使用中の Auth0 SDK のバージョンと互換性があることを確認します
</Accordion>

<Accordion title="本番環境での考慮事項">
  ### セキュリティのベストプラクティス

  * **安全なトークン保存**: トークンの保存には、プラットフォーム固有の安全なストレージ (Android Keystore、iOS Keychain) を使用します
  * **トークンの更新**: ユーザーセッションを維持するため、リフレッシュトークンの処理を実装します
  * **証明書ピンニング**: API セキュリティをさらに強化するために、証明書ピンニングを検討します
  * **ProGuard/コード難読化**: Android でコード難読化を使用する場合は、適切なルールを追加します

  ### App Store の要件

  * **プライバシーポリシー**: Auth0 の利用について説明したプライバシーポリシーがアプリにあることを確認します
  * **ユーザーデータの取り扱い**: ユーザーの認証データの取り扱いについて、プラットフォームのガイドラインに従います
  * **ディープリンク**: さまざまなシナリオでコールバック URL の処理を十分にテストします
  * **ネットワーク要件**: オフライン時にも適切に対応できるようにします

  ### パフォーマンスの最適化

  * **Auth0Client をキャッシュする**: インスタンスを 1 つだけ作成し、アプリ全体で再利用します
  * **遅延読み込み**: 必要になったときにのみ Auth0Client を初期化します
  * **バックグラウンド更新**: 長時間のセッションに備えて、バックグラウンドでのトークン更新を実装します
</Accordion>

<Accordion title="高度な設定">
  ### カスタムスコープと audience

  特定のスコープをリクエストし、API の audience を設定します。

  ```cs AdvancedAuth.cs expandable lines theme={null}
  var auth0Client = new Auth0Client(new Auth0ClientOptions
  {
      Domain = "{yourDomain}",
      ClientId = "{yourClientId}",
      Scope = "openid profile email offline_access read:posts write:posts",
      Audience = "https://myapi.example.com"
  });

  var loginResult = await auth0Client.LoginAsync();
  ```

  ### 追加パラメータ

  認可リクエストに追加のパラメータを渡します。

  ```cs ExtraParams.cs expandable lines theme={null}
  var extraParameters = new Dictionary<string, string>
  {
      { "prompt", "login" },
      { "ui_locales", "es" },
      { "custom_param", "value" }
  };

  var loginResult = await auth0Client.LoginAsync(extraParameters);
  ```

  ### リフレッシュトークン

  リフレッシュトークンを使用すると、ユーザーの操作なしで新しいアクセストークンを取得できます。

  ```cs RefreshToken.cs expandable lines theme={null}
  var refreshResult = await auth0Client.RefreshTokenAsync(loginResult.RefreshToken);

  if (!refreshResult.IsError)
  {
      var newAccessToken = refreshResult.AccessToken;
      var newIdToken = refreshResult.IdentityToken;
      // 新しいトークンを保存
  }
  ```

  <Info>
    リフレッシュトークンを受け取るには、認証リクエストに `offline_access` スコープを含めてください。
  </Info>

  ### プラットフォーム固有のブラウザ設定

  **Android - カスタムカラーで Chrome Custom Tabs を使用する:**

  ```cs AndroidBrowser.cs expandable lines theme={null}
  var auth0Client = new Auth0Client(new Auth0ClientOptions
  {
      Domain = "{yourDomain}",
      ClientId = "{yourClientId}",
      Browser = new AndroidBrowser
      {
          ToolbarColor = Android.Graphics.Color.ParseColor("#FF6B35")
      }
  }, this);
  ```

  **iOS - カスタム表示で SFSafariViewController を使用する:**

  ```cs iOSBrowser.cs expandable lines theme={null}
  var auth0Client = new Auth0Client(new Auth0ClientOptions
  {
      Domain = "{yourDomain}",
      ClientId = "{yourClientId}",
      Browser = new ASWebAuthenticationSessionBrowser
      {
          PrefersEphemeralWebBrowserSession = false
      }
  });
  ```
</Accordion>

***

<div id="next-steps">
  ## 次のステップ
</div>

<CardGroup cols={2}>
  <Card title="IDプロバイダーを設定する" icon="key" href="/docs/ja-jp/authenticate/identity-providers" iconType="solid">
    Google、Facebook、GitHub などのソーシャルログイン用プロバイダーを追加する
  </Card>

  <Card title="多要素認証を有効にする" icon="shield-halved" href="/docs/ja-jp/secure/multi-factor-authentication" iconType="solid">
    MFA でセキュリティをさらに強化する
  </Card>

  <Card title="攻撃対策" icon="shield" href="/docs/ja-jp/secure/attack-protection" iconType="solid">
    ブルートフォース攻撃やボット攻撃から保護する方法を学ぶ
  </Card>

  <Card title="ログインエクスペリエンスをカスタマイズする" icon="paintbrush" href="/docs/ja-jp/customize/universal-login-pages" iconType="solid">
    ブランドに合わせて Universal Login ページをカスタマイズする
  </Card>
</CardGroup>
