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

AI を使って Auth0 を統合する

Claude Code、Cursor、GitHub Copilot などの AI コーディングアシスタントを使用している場合は、agent skills を使って、数分で Auth0 認証を自動的に追加できます。まず、Auth0 agent skills をインストールします。
npx skills add auth0/agent-skills --skill auth0-quickstart --skill auth0-ionic-angular
次に、AI アシスタントに次のように指示します。
Add Auth0 authentication to my Ionic Angular app
AI アシスタントが、Auth0 アプリケーションの作成、認証情報の取得、Auth0 Angular SDK と Capacitor プラグインのインストール、ディープリンクの設定、ネイティブブラウザー統合によるログイン/ログアウトフローの実装を自動的に行います。詳細については、Auth0 agent skills を参照してください。

はじめに

このクイックスタートでは、Capacitor を使用する Ionic Angular アプリケーションに Auth0 認証を追加する方法を説明します。Auth0 Angular SDK と Capacitor のネイティブブラウザープラグインを使用して、ログイン、ログアウト、ユーザープロファイル機能を備えたモバイル対応アプリを構築します。
1

新しいプロジェクトの作成

Capacitor を使用して新しい Ionic Angular プロジェクトを作成
npx ionic start auth0-ionic-angular tabs --type=angular-standalone --capacitor
プロジェクトを開く
cd auth0-ionic-angular
@ionic/cli パッケージを使用していることを確認してください (非推奨の ionic パッケージではありません) 。プロジェクト作成時に --npm-client に関するエラーが表示される場合は、CLI を更新してください。
npm uninstall -g ionic
npm i -g @ionic/cli
2

Auth0 Angular SDK と Capacitor プラグインをインストール

Capacitor’s Browser プラグインおよび App プラグインと併せて、Auth0 Angular SDK をインストールします:
npm install @auth0/auth0-angular @capacitor/browser @capacitor/app
iOS 版の Capacitor Browser プラグインは SFSafariViewController を使用します。iOS 11 以降では、これは Safari と Cookie を共有しません。そのため、これらのデバイスでは SSO は機能しません。SSO が必要な場合は、ASWebAuthenticationSession を使用する互換性のあるプラグインを使用してください。
3

Auth0 アプリを設定する

次に、Auth0テナントで新しいアプリを作成し、プロジェクトに環境変数を追加します。Auth0アプリをセットアップするには、次の3つの方法があります。Quick Setupツールを使用する (推奨) 、CLIコマンドを実行する、またはDashboardから手動で設定する方法です。
ネイティブ Auth0 アプリを作成し、適切な設定値があらかじめ入力された環境ファイルをコピーします。アプリを作成したら、Auth0 DashboardSettings タブで Allowed Callback URLsAllowed Logout URLs を更新してください。YOUR_PACKAGE_ID は、capacitor.config.tsappId (デフォルト: io.ionic.starter) に置き換えます。Allowed Callback URLsAllowed Logout URLs:
YOUR_PACKAGE_ID://{yourDomain}/capacitor/YOUR_PACKAGE_ID/callback
4

Auth0 モジュールを構成する

前の手順で環境ファイルを配置したら、アプリでAuth0モジュールを設定します。
src/main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { RouteReuseStrategy, provideRouter } from '@angular/router';
import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
import { provideAuth0 } from '@auth0/auth0-angular';
import { environment } from './environments/environment';
import config from '../capacitor.config';
import { routes } from './app/app.routes';
import { AppComponent } from './app/app.component';

const redirect_uri = `${config.appId}://${environment.auth0.domain}/capacitor/${config.appId}/callback`;

bootstrapApplication(AppComponent, {
  providers: [
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
    provideIonicAngular(),
    provideRouter(routes),
    provideAuth0({
      domain: environment.auth0.domain,
      clientId: environment.auth0.clientId,
      useRefreshTokens: true,
      useRefreshTokensFallback: false,
      authorizationParams: {
        redirect_uri,
      },
    }),
  ],
});
provideAuth0 の設定には、次が含まれます。
  • useRefreshTokens: true — モバイルでは必須です。Capacitor アプリでは iframe ベースのサイレント認証を使用できないため、セッションの更新にはリフレッシュトークンを使用します。
  • useRefreshTokensFallback: false — モバイルでは必須です。ネイティブアプリでは利用できない iframe ベースのサイレント認証に SDK がフォールバックするのを防ぎます。
  • authorizationParams.redirect_uri — 認証後にアプリへリダイレクトして戻れるよう、アプリのカスタム URL スキームを使用します。
アプリケーションを閉じて再度開いたあとも認証状態を保持するには、cacheLocationlocalstorage に設定するとよい場合があります。ただし、localstorage にトークンを保存するリスクがあることに注意してください。また、Capacitor アプリでは localstorage は一時的なストレージとして扱う必要があります。Capacitor ドキュメントのストレージに関するガイダンスも確認してください。
5

ログイン、ログアウト、Profile コンポーネントを作成する

コンポーネントファイルを作成する
touch src/app/login-button.component.ts && touch src/app/logout-button.component.ts && touch src/app/profile.component.ts
各コンポーネントに以下のコードを追加します。次に、Auth0 コールバックを処理するよう App コンポーネントを更新し、ホームページでコンポーネントを使用できるようにします。
src/app/app.component.ts の内容を次のように置き換えます。
src/app/app.component.ts
import { Component, OnInit, NgZone, inject } from '@angular/core';
import { AuthService } from '@auth0/auth0-angular';
import { mergeMap } from 'rxjs/operators';
import { Browser } from '@capacitor/browser';
import { App } from '@capacitor/app';
import { IonApp, IonRouterOutlet } from '@ionic/angular/standalone';
import { environment } from '../environments/environment';
import config from '../../capacitor.config';

const callbackUri = `${config.appId}://${environment.auth0.domain}/capacitor/${config.appId}/callback`;

@Component({
  selector: 'app-root',
  standalone: true,
  imports: [IonApp, IonRouterOutlet],
  template: '<ion-app><ion-router-outlet></ion-router-outlet></ion-app>',
})
export class AppComponent implements OnInit {
  private auth = inject(AuthService);
  private ngZone = inject(NgZone);

  ngOnInit(): void {
    App.addListener('appUrlOpen', ({ url }) => {
      this.ngZone.run(() => {
        if (url?.startsWith(callbackUri)) {
          if (
            url.includes('state=') &&
            (url.includes('error=') || url.includes('code='))
          ) {
            this.auth
              .handleRedirectCallback(url)
              .pipe(mergeMap(() => Browser.close()))
              .subscribe();
          } else {
            Browser.close();
          }
        }
      });
    });
  }
}
App Component の appUrlOpen イベントコールバックは、this.ngZone.run() でラップされています。これは必須です。Capacitor プラグインのコールバックは Angular の zone の外で実行されるため、これがないとログイン後の認証状態の変化を Angular が検出できません。詳しくは、Using Angular with Capacitor を参照してください。
6

アプリを実行する

まず、ブラウザーでテストしてください:
ionic serve
ブラウザーで ionic serve を実行する場合、ブラウザーはカスタム URL スキームを処理できないため、カスタム URL スキームによるリダイレクトは機能しません。ブラウザーでテストする際は、一時的に src/main.tsredirect_urihttp://localhost:8100 に変更し、Dashboard で Auth0 アプリの Allowed Callback URLsAllowed Logout URLshttp://localhost:8100 を追加してください。ネイティブ向けにビルドする前に、この変更を元に戻すのを忘れないでください。
デバイスまたはシミュレーターで実行するには、まずネイティブプラットフォームを追加します。
npx cap add ios
npx cap add android
次に、ビルド、同期、実行を行います。
ionic build && npx cap sync && npx cap run ios
実行する前に、npx cap add を使用してネイティブプラットフォームを追加する必要があります。これはプラットフォームごとに一度だけ実行すれば十分です。カスタム URL スキームが登録されていることを確認してください (詳細は以下の Advanced Usage を参照) 。
チェックポイントこれで、Auth0 のログインページが localhost 上で正常に動作しているはずです

高度な使い方

--type=angular (--type=angular-standalone ではなく) でプロジェクトを作成した場合や、NgModule を使いたい場合は、AuthModule.forRoot で SDK を設定します。
src/app/app.module.ts
import { NgModule } from '@angular/core';
import { BrowserModule } from '@angular/platform-browser';
import { RouteReuseStrategy } from '@angular/router';
import { IonicModule, IonicRouteStrategy } from '@ionic/angular';
import { AuthModule } from '@auth0/auth0-angular';
import { environment } from '../environments/environment';
import config from '../../capacitor.config';

import { AppRoutingModule } from './app-routing.module';
import { AppComponent } from './app.component';

const redirect_uri = `${config.appId}://${environment.auth0.domain}/capacitor/${config.appId}/callback`;

@NgModule({
  declarations: [AppComponent],
  imports: [
    BrowserModule,
    IonicModule.forRoot(),
    AppRoutingModule,
    AuthModule.forRoot({
      domain: environment.auth0.domain,
      clientId: environment.auth0.clientId,
      useRefreshTokens: true,
      useRefreshTokensFallback: false,
      authorizationParams: {
        redirect_uri,
      },
    }),
  ],
  providers: [{ provide: RouteReuseStrategy, useClass: IonicRouteStrategy }],
  bootstrap: [AppComponent],
})
export class AppModule {}
NgModule を使用する場合は、inject() ではなくコンストラクター (constructor(public auth: AuthService)) 経由で AuthService を注入してください。テンプレートでは @if の制御フロー構文ではなく、*ngIf="auth.user$ | async as user" を使用します。コンポーネントは standalone: true としてマークするのではなく、モジュール内で宣言する必要があります。
実機で認証をテストするには、各プラットフォームでカスタム URL スキームを登録します。

iOS

ios/App/App/Info.plist にカスタム URL スキームを登録します。
<key>CFBundleURLTypes</key>
<array>
  <dict>
    <key>CFBundleURLSchemes</key>
    <array>
      <string>YOUR_PACKAGE_ID</string>
    </array>
  </dict>
</array>
YOUR_PACKAGE_IDcapacitor.config.tsappId に置き換えてください。詳細は、Defining a Custom URL Scheme を参照してください。

Android

android/app/src/main/AndroidManifest.xml<activity> タグ内にインテントフィルターを追加します。
<intent-filter>
  <action android:name="android.intent.action.VIEW" />
  <category android:name="android.intent.category.DEFAULT" />
  <category android:name="android.intent.category.BROWSABLE" />
  <data android:scheme="YOUR_PACKAGE_ID" />
</intent-filter>
YOUR_PACKAGE_IDcapacitor.config.tsappId に置き換えてください。詳細は、Create Deep Links to App Content を参照してください。

ビルドしてデバイスで実行する

ionic build && npx cap sync && npx cap open ios
または Android の場合:
ionic build && npx cap sync && npx cap open android
認証が必要なルートを保護するには、関数ベースのガードを使用します。
src/app/app.routes.ts
import { Routes } from '@angular/router';
import { authGuardFn } from '@auth0/auth0-angular';

export const routes: Routes = [
  {
    path: 'tabs',
    loadComponent: () => import('./tabs/tabs.page').then((m) => m.TabsPage),
    children: [
      {
        path: 'tab1',
        loadComponent: () => import('./tab1/tab1.page').then((m) => m.Tab1Page),
      },
      {
        path: 'tab2',
        loadComponent: () => import('./tab2/tab2.page').then((m) => m.Tab2Page),
        canActivate: [authGuardFn],
      },
      {
        path: 'tab3',
        loadComponent: () => import('./tab3/tab3.page').then((m) => m.Tab3Page),
        canActivate: [authGuardFn],
      },
      {
        path: '',
        redirectTo: '/tabs/tab1',
        pathMatch: 'full',
      },
    ],
  },
  {
    path: '',
    redirectTo: '/tabs/tab1',
    pathMatch: 'full',
  },
];
未認証のユーザーが保護されたルートに遷移すると、authGuardFn によって Auth0 のログインページへ自動的にリダイレクトされます。
API 呼び出しにアクセストークンを自動的に付与するように、HTTP インターセプターを設定します。
src/main.ts
import { bootstrapApplication } from '@angular/platform-browser';
import { RouteReuseStrategy, provideRouter } from '@angular/router';
import { IonicRouteStrategy, provideIonicAngular } from '@ionic/angular/standalone';
import { provideHttpClient, withInterceptors } from '@angular/common/http';
import { provideAuth0, authHttpInterceptorFn } from '@auth0/auth0-angular';
import { environment } from './environments/environment';
import config from '../capacitor.config';
import { routes } from './app/app.routes';
import { AppComponent } from './app/app.component';

const redirect_uri = `${config.appId}://${environment.auth0.domain}/capacitor/${config.appId}/callback`;

bootstrapApplication(AppComponent, {
  providers: [
    { provide: RouteReuseStrategy, useClass: IonicRouteStrategy },
    provideIonicAngular(),
    provideRouter(routes),
    provideAuth0({
      domain: environment.auth0.domain,
      clientId: environment.auth0.clientId,
      useRefreshTokens: true,
      useRefreshTokensFallback: false,
      authorizationParams: {
        redirect_uri,
        audience: 'YOUR_API_IDENTIFIER',
      },
      httpInterceptor: {
        allowedList: [
          'http://localhost:3001/api/*',
        ],
      },
    }),
    provideHttpClient(
      withInterceptors([authHttpInterceptorFn])
    ),
  ],
});
次に、Angular の HttpClient を使って API を呼び出します。インターセプターによって Bearer トークンが自動的に付与されます。
src/app/api.service.ts
import { Injectable, inject } from '@angular/core';
import { HttpClient } from '@angular/common/http';

@Injectable({ providedIn: 'root' })
export class ApiService {
  private http = inject(HttpClient);

  getData() {
    return this.http.get('http://localhost:3001/api/data');
  }
}
httpInterceptor.allowedList は、アクセストークンを付与する API エンドポイントを決定します。API 用のアクセストークンをリクエストするには、audience パラメーターを含めてください。YOUR_API_IDENTIFIER は、Auth0 Dashboard > APIs の識別子に置き換えてください。

次のステップ

詳細については、以下のリソースを参照してください。