メインコンテンツへスキップ

AI を使って Auth0 を統合する

Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使用している場合は、agent skills を使って、数分で Auth0 認証を自動的に追加できます。インストール:
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-net-android --skill auth0-net-ios
次に、AI アシスタントに次のように依頼します。
Add Auth0 authentication to my .NET Android & iOS app
AI アシスタントが、Auth0 アプリケーションの作成、認証情報の取得、Auth0 OidcClient SDK のインストール、プラットフォーム固有の設定、ログイン/ログアウトフローの実装を自動的に行います。agent skills の完全なドキュメント →

はじめに

1

新しい .NET プロジェクトを作成

このクイックスタートでは、新しい .NET MAUI または .NET Android/iOS プロジェクトを作成します。
Visual Studio 2022 以降の場合:
  1. FileNewProject
  2. .NET MAUI App テンプレートを選択します
  3. プロジェクトを設定します。
    • Project name: Auth0MauiSample
    • Location: 任意の場所を選択します
    • Framework: .NET 8.0 以降
  4. Create をクリックします
このクイックスタートでは、Xamarin.Android と Xamarin.iOS の次世代版である .NET Android と .NET iOS を対象としています。現在も Xamarin を使用している場合でも、統合方法は同じで SDK には互換性があるため、このガイドに従うことができます。
2

Auth0 SDK をインストール

Auth0 OIDC Client SDK をプロジェクトに追加します。
Package Manager Console (ViewOther WindowsPackage Manager Console) を開き、適切なパッケージをインストールします。.NET Android の場合:
Package Manager Console
Install-Package Auth0.OidcClient.AndroidX
.NET iOS の場合:
Package Manager Console
Install-Package Auth0.OidcClient.iOS
.NET MAUI (両方のプラットフォーム) の場合:
Package Manager Console
Install-Package Auth0.OidcClient.MAUI
Auth0 OIDC Client SDK は、OAuth 2.0 と OIDC のプロトコルの詳細をすべて処理し、認証用のシンプルな API を提供します。
3

Auth0 アプリケーションを設定する

Auth0テナントに新しいアプリケーションを作成し、モバイル向けに設定します。
  1. Auth0 Dashboard に移動します
  2. ApplicationsApplicationsCreate Application をクリックします
  3. アプリの名前を入力し、アプリケーションタイプとして Native を選択して、Create をクリックします
  4. Application Details ページで Settings タブに切り替えます
  5. DomainClient ID を控えておきます。これらは次の手順で使用します
コールバックURLを設定する:Settings タブで、次のURLを追加します。Allowed Callback URLs:
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
Allowed Logout URLs:コールバックURLと同じURLを使用します。
コールバックURLとログアウトURLは 小文字 で指定してください。URLが一致しないと、認証は失敗します。
Allowed Callback URLs はセキュリティ上重要です。これにより、認証後にユーザーが安全にアプリケーションへ戻れるようになります。一致するURLがない場合、ログイン処理は失敗します。Allowed Logout URLs を設定すると、ユーザーのサインアウト時にAuth0のページに残るのではなく、アプリにリダイレクトされるため、シームレスな体験を提供できます。
4

Auth0クライアントの初期化

Auth0 と通信するための Auth0Client インスタンスを作成します。
MainActivity.cs
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);
    }
}
YOUR_ANDROID_PACKAGE_NAME{yourDomain}{yourClientId} を実際の値に置き換えてください。DataSchemeDataHostDataPathPrefix 内のテキストはすべて小文字にしてください。
IntentFilter は、コールバック URL を処理するようアプリを登録します。LaunchMode.SingleTask を指定すると、コールバック時に Android が新しいアクティビティインスタンスを作成しないようになります。
保守性を高めるため、Auth0 のドメインとクライアントIDはハードコードせず、設定ファイルまたはアプリ設定に保存してください。
5

ログインとログアウトの実装

ユーザー認証を処理するメソッドを追加します。ログインを実装します。
Authentication.cs
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}");
    }
}
ログアウトを実装する:
Authentication.cs
public async Task LogoutAsync()
{
    var logoutResult = await auth0Client.LogoutAsync();

    if (logoutResult == BrowserResultType.Success)
    {
        // 保存された認証情報をクリア
        // UIをログアウト状態に更新
        Console.WriteLine("Logged out successfully");
    }
}
LoginAsync() メソッドは、システムブラウザー (Android では Chrome Custom Tabs) を起動して、Auth0 の Universal Login ページを表示します。認証後、ユーザーはコールバック URL 経由でアプリにリダイレクトされます。
これらのメソッドを MainActivity (Android) または ViewController (iOS) に追加し、ユーザーが Login/Logout ボタンをタップしたときに呼び出します。
6

アプリを実行する

アプリケーションをビルドして実行します。
Android の場合:
  1. デバイスのドロップダウンから Android エミュレーターまたは接続済みのデバイスを選択します
  2. F5 キーを押すか、Run ボタンをクリックします
  3. アプリがビルド、デプロイされ、起動します
iOS の場合 (Mac ビルド ホストが必要) :
  1. Mac ビルド ホストに接続します
  2. デバイスのドロップダウンから iOS シミュレーターまたはデバイスを選択します
  3. F5 キーを押すか、Run ボタンをクリックします
想定されるフロー:
  1. アプリが起動し、Login ボタンが表示されます
  2. Log In をタップすると、ブラウザーまたは Chrome カスタムタブが開くので、認証を完了します
  3. 自動的にアプリにリダイレクトされます
  4. ユーザーの認証が正常に完了します
初回実行時には、認証のためにブラウザーを開くことを iOS が確認する場合があります。これは正常で想定どおりの動作です。
チェックポイントこれで、.NET Android または iOS アプリケーションで、完全に機能する Auth0 のログイン機能を利用できるようになりました。このアプリは、安全な認証のためにシステムブラウザーを使用し、コールバックフローを自動的に処理します。

ユーザー情報にアクセスする

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

認証結果

LoginAsync() メソッドは、次の内容を含む LoginResult オブジェクトを返します。
UserInfo.cs
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}");
}

すべてのクレームを確認する

利用可能なすべてのユーザー情報を確認するには:
UserClaims.cs
if (!loginResult.IsError)
{
    foreach (var claim in loginResult.User.Claims)
    {
        Console.WriteLine($"{claim.Type}: {claim.Value}");
    }
}
返されるクレームは、要求したスコープによって異なります。詳しくは、Auth0 OIDC Client ドキュメントの Using Scopes を参照してください。

カスタムスコープをリクエストする

追加のユーザー情報を取得するには、Auth0Client の作成時にスコープを指定します。
CustomScopes.cs
var auth0Client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Scope = "openid profile email offline_access read:posts"
});

トラブルシューティングと高度な設定

ブラウザーからアプリにリダイレクトされない

解決策:
  1. Auth0 Dashboard のコールバック URL が、アプリのパッケージ名またはバンドル識別子と正確に一致していることを確認します
  2. コールバック URL が 小文字 になっていることを確認します
  3. DataSchemeDataHostDataPathPrefix (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 TypeNative に設定します
  4. Token Endpoint Authentication MethodNone に設定します
  5. Save Changes をクリックします

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

解決策:
  • Info.plist に正しい URL スキーム設定が含まれていることを確認します
  • AppDelegateOpenUrl() が実装されていることを確認します
  • iOS のデプロイターゲットが使用中の Auth0 SDK バージョンと互換性があることを確認します

セキュリティのベストプラクティス

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

App Store の要件

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

パフォーマンスの最適化

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

カスタムスコープとオーディエンス

特定のスコープをリクエストし、API のオーディエンスを設定します。
AdvancedAuth.cs
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();

追加パラメーター

認可リクエストに追加のパラメーターを渡します。
ExtraParams.cs
var extraParameters = new Dictionary<string, string>
{
    { "prompt", "login" },
    { "ui_locales", "es" },
    { "custom_param", "value" }
};

var loginResult = await auth0Client.LoginAsync(extraParameters);

リフレッシュトークン

ユーザーの操作なしで新しいアクセストークンを取得するには、リフレッシュトークンを使用します。
RefreshToken.cs
var refreshResult = await auth0Client.RefreshTokenAsync(loginResult.RefreshToken);

if (!refreshResult.IsError)
{
    var newAccessToken = refreshResult.AccessToken;
    var newIdToken = refreshResult.IdentityToken;
    // 新しいトークンを保存
}
リフレッシュトークンを受け取るには、認証リクエストに offline_access スコープを含めてください。

プラットフォーム別のブラウザー設定

Android - Chrome Custom Tabs でカスタムカラーを使用する:
AndroidBrowser.cs
var auth0Client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Browser = new AndroidBrowser
    {
        ToolbarColor = Android.Graphics.Color.ParseColor("#FF6B35")
    }
}, this);
iOS - SFSafariViewController でカスタム表示を使用する:
iOSBrowser.cs
var auth0Client = new Auth0Client(new Auth0ClientOptions
{
    Domain = "{yourDomain}",
    ClientId = "{yourClientId}",
    Browser = new ASWebAuthenticationSessionBrowser
    {
        PrefersEphemeralWebBrowserSession = false
    }
});

次のステップ

IDプロバイダーを設定する

Google、Facebook、GitHub などのソーシャルログインプロバイダーを追加します

MFA を有効にする

MFA によりセキュリティをさらに強化します

攻撃対策

ブルートフォース攻撃やボット攻撃を防ぐ方法を確認します

ログインエクスペリエンスをカスタマイズする

ブランドに合わせて Universal Login ページをカスタマイズします