> ## 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-quickstart --skill auth0-net-android --skill auth0-net-ios
  ```

  **次に、AI アシスタントに次のように依頼します。**

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

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

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

<Steps>
  <Step title="新しい .NET プロジェクトを作成" stepNumber={1}>
    このクイックスタートでは、新しい .NET MAUI または .NET Android/iOS プロジェクトを作成します。

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

        1. **File** → **New** → **Project**
        2. **.NET MAUI App** テンプレートを選択します
        3. プロジェクトを設定します。
           * **Project name**: `Auth0MauiSample`
           * **Location**: 任意の場所を選択します
           * **Framework**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>

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

        1. **File** → **New** → **Project**
        2. **Android App (.NET)** テンプレートを選択します
        3. プロジェクトを設定します。
           * **Project name**: `Auth0AndroidSample`
           * **Framework**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>

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

        1. **File** → **New** → **Project**
        2. **iOS App (.NET)** テンプレートを選択します
        3. プロジェクトを設定します。
           * **Project name**: `Auth0iOSSample`
           * **Framework**: **.NET 8.0 以降**
        4. **Create** をクリックします
      </Tab>
    </Tabs>

    <Info>
      このクイックスタートでは、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 のプロトコルの詳細をすべて処理し、認証用のシンプルな API を提供します。
    </Tip>
  </Step>

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

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

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

    **Settings** タブで、次の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` はアプリのバンドル識別子に置き換えます (例: `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 が新しいアクティビティインスタンスを作成しないようになります。
        </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 のドメインとクライアントIDはハードコードせず、設定ファイルまたはアプリ設定に保存してください。
    </Tip>
  </Step>

  <Step title="ログインとログアウトの実装" stepNumber={5}>
    ユーザー認証を処理するメソッドを追加します。

    **ログインを実装します。**

    ```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}");
        }
    }
    ```

    **ログアウトを実装する:**

    ```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()` メソッドは、システムブラウザー (Android では Chrome Custom Tabs) を起動して、Auth0 の Universal Login ページを表示します。認証後、ユーザーはコールバック 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 カスタムタブが開くので、認証を完了します
    3. 自動的にアプリにリダイレクトされます
    4. ユーザーの認証が正常に完了します

    <Tip>
      初回実行時には、認証のためにブラウザーを開くことを iOS が確認する場合があります。これは正常で想定どおりの動作です。
    </Tip>
  </Step>
</Steps>

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

  これで、.NET Android または iOS アプリケーションで、完全に機能する Auth0 のログイン機能を利用できるようになりました。このアプリは、安全な認証のためにシステムブラウザーを使用し、コールバックフローを自動的に処理します。
</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 ドキュメントの [Using Scopes](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">
  ## トラブルシューティングと高度な設定
</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 が小文字になっていることを確認します
  * コード内のドメインが Auth0 Dashboard のドメインと一致していることを確認します

  ### LoginAsync() がハングする、または完了しない

  **解決策:**

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

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

  **修正方法:**

  1. Dashboard で Auth0 アプリケーション設定を開きます
  2. **Application Properties** までスクロールします
  3. **Application Type** を **Native** に設定します
  4. **Token Endpoint Authentication Method** を **None** に設定します
  5. **Save Changes** をクリックします

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

  **解決策:**

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

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

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

  ### App Store の要件

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

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

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

<Accordion title="高度な設定">
  ### カスタムスコープとオーディエンス

  特定のスコープをリクエストし、API のオーディエンスを設定します。

  ```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="/ja/docs/authenticate/identity-providers" iconType="solid">
    Google、Facebook、GitHub などのソーシャルログインプロバイダーを追加します
  </Card>

  <Card title="MFA を有効にする" icon="shield-halved" href="/ja/docs/secure/multi-factor-authentication" iconType="solid">
    MFA によりセキュリティをさらに強化します
  </Card>

  <Card title="攻撃対策" icon="shield" href="/ja/docs/secure/attack-protection" iconType="solid">
    ブルートフォース攻撃やボット攻撃を防ぐ方法を確認します
  </Card>

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