auth0-ionic-angular について
Capacitor を使う Ionic Angular アプリに Auth0 認証を組み込むためのスキルです。システムブラウザーとディープリンクを使ったログイン、ログアウト、プロフィール表示、トークン管理を扱います。
主な機能
- 01Auth0 Angular SDK の統合
- 02システムブラウザーでのログインとログアウト
- 03ディープリンク認証コールバックの処理
- 04ユーザープロフィールとトークンの取得
- 05自動または手動セットアップの案内
活用シーン
- 01Ionic Angular モバイルアプリへのログイン追加
- 02iOS と Android の認証コールバック処理
- 03プロフィール表示とトークン管理
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ auth0/ agent-skills --skill auth0-ionic-angularインストール後、Claude Code で/auth0-ionic-angularを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/api.mdintegration.mdsetup.mdtests/benchmark-config.jsonevals.jsongraders.jsongraders.tspackage.jsonprompt.mdrun-evals.mjs詳細
Auth0 Ionic Angular(Capacitor)連携
@auth0/auth0-angular SDK と Capacitor プラグインを使用して、Ionic Angular アプリケーションに認証機能を追加します。ログイン、ログアウト、ユーザープロフィールの表示、そして Capacitor の Browser プラグインを介したシステムブラウザー(iOS では SFSafariViewController、Android では Chrome Custom Tabs)による安全なトークン管理について説明します。
前提条件
- Node.js 20 以降、npm 10 以降
- Ionic CLI(
npm install -g @ionic/cli) - プロジェクトで Capacitor 5 以降が設定済みであること
- Auth0 CLI(自動セットアップ用):
brew install auth0/auth0-cli/auth0 - Auth0 アカウント(無料プランで利用できます)
使用しない場合
| 使用ケース | 推奨スキル |
|---|---|
| Capacitor を使用する Ionic React アプリ | auth0-ionic-react |
| Capacitor を使用する Ionic Vue アプリ | auth0-ionic-vue |
| Angular SPA(ブラウザー専用、Capacitor なし) | auth0-angular または auth0-react |
| React Native(Ionic なし) | auth0-react-native |
| Expo(React Native) | auth0-expo |
| ネイティブ iOS(Swift) | auth0-swift |
| ネイティブ Android(Kotlin) | auth0-android |
クイックスタートのワークフロー
エージェントへの指示: 以下の手順を順番に実行してください。プロンプトに認証情報がすでに含まれている場合でも、先に進む前に必ず
AskUserQuestionを使用して、開発者に自動セットアップと手動セットアップのどちらを選ぶか尋ねてください。セキュリティ — 認証情報を表示しないでください: CLI またはファイルから Auth0 の認証情報(ドメイン、クライアント ID)を取得した後、それらをテキスト出力に表示、エコー、出力してはなりません。設定ファイル(
src/environments/environment.ts)に直接、出力せずに書き込んでください。「Domain: xxx」や「Client ID: yyy」のような出力をしてはなりません。代わりに、設定ファイルを書き込んだことを確認し、ファイルの場所をユーザーに伝えてください。UI の再利用: 新しいログイン/ログアウトコンポーネントを作成する前に、既存のプロジェクト内でログイン/ログアウトのハンドラーやボタンを検索してください。見つかった場合は、重複したコンポーネントを作成せず、既存の UI に Auth0 を組み込んでください。
ステップ 1:依存関係のインストール
npm install @auth0/auth0-angular @capacitor/browser @capacitor/app
ステップ 2:Auth0 の設定
エージェントへの指示: ユーザーがすでに認証情報を提供している場合でも、必ず
AskUserQuestionを使用してセットアップ方法を提示してください。AskUserQuestion: question: "Ionic Angular アプリの Auth0 をどのように設定しますか?" options: - label: "自動セットアップ(推奨)" description: "Auth0 CLI を使用してネイティブアプリケーションを作成し、コールバック URL を設定して、プロジェクトに認証情報を自動的に保存します。" - label: "手動セットアップ" description: "Auth0 ドメインとクライアント ID を含む .env ファイルを用意していただき、エージェントがそれを読み込んでプロジェクト設定に書き込みます。"どちらの方法を選んだ場合も、両方の方法の手順を詳しく説明したセットアップガイドに従ってください。
Auth0 ダッシュボードの設定(アプリケーションタイプ:Native):
| 設定 | 値 |
|---|---|
| アプリケーションタイプ | Native |
| 許可されたコールバック URL | PACKAGE_ID://YOUR_DOMAIN/capacitor/PACKAGE_ID/callback |
| 許可されたログアウト URL | PACKAGE_ID://YOUR_DOMAIN/capacitor/PACKAGE_ID/callback |
| 許可されたオリジン | capacitor://localhost, http://localhost |
PACKAGE_ID は capacitor.config.ts の appId(例:com.example.myapp)に、YOUR_DOMAIN は Auth0 ドメインに置き換えてください。
注: 自動セットアップでは、これらの URL は Auth0 CLI によって自動的に設定されます。手動セットアップでは、ユーザーが Auth0 ダッシュボードで設定する必要があります。
注: ローカルで Web 開発(
ionic serve)を行う場合は、許可されたコールバック URL、許可されたログアウト URL、および許可された Web オリジンにもhttp://localhost:8100を追加してください。
ステップ 3:SDK を設定する
src/app/app.module.ts(NgModule)または src/app/app.config.ts(スタンドアロン)で設定します。
provideAuth0() 関数(または AuthModule.forRoot())は、Angular における Auth0Provider に相当します。アプリをラップするプロバイダー/ラッパーとして機能し、AuthService をアプリ全体で利用できるようにします。ionic serve でローカルの Web 開発を行う場合、コールバック URL は http://localhost:8100 です。
スタンドアロン(Angular 17 以降):
import { ApplicationConfig } from '@angular/core';
import { provideAuth0 } from '@auth0/auth0-angular';
// Replace with your capacitor.config.ts appId and Auth0 domain
const appId = 'com.example.myapp';
const domain = 'YOUR_AUTH0_DOMAIN';
const callbackUri = `${appId}://${domain}/capacitor/${appId}/callback`;
export const appConfig: ApplicationConfig = {
providers: [
provideAuth0({
domain,
clientId: 'YOUR_AUTH0_CLIENT_ID',
useRefreshTokens: true,
useRefreshTokensFallback: false,
authorizationParams: {
redirect_uri: callbackUri,
},
}),
],
};
NgModule(Angular 16 以前):
import { AuthModule } from '@auth0/auth0-angular';
const appId = 'com.example.myapp';
const domain = 'YOUR_AUTH0_DOMAIN';
const callbackUri = `${appId}://${domain}/capacitor/${appId}/callback`;
@NgModule({
imports: [
AuthModule.forRoot({
domain,
clientId: 'YOUR_AUTH0_CLIENT_ID',
useRefreshTokens: true,
useRefreshTokensFallback: false,
authorizationParams: {
redirect_uri: callbackUri,
},
}),
],
})
export class AppModule {}
ステップ 4:ディープリンクのコールバックを処理する(AppComponent)
ナビゲーション中もリスナーが維持されるよう、アプリのルートで appUrlOpen リスナーを登録します。
import { Component, NgZone, OnInit } from '@angular/core';
import { AuthService } from '@auth0/auth0-angular';
import { Browser } from '@capacitor/browser';
import { App as CapApp } from '@capacitor/app';
import { mergeMap } from 'rxjs/operators';
@Component({
selector: 'app-root',
template: `<ion-app><ion-router-outlet></ion-router-outlet></ion-app>`,
})
export class AppComponent implements OnInit {
constructor(
private auth: AuthService,
private ngZone: NgZone
) {}
ngOnInit() {
CapApp.addListener('appUrlOpen', ({ url }) => {
this.ngZone.run(() => {
if (url.includes('state') && (url.includes('code') || url.includes('error'))) {
this.auth
.handleRedirectCallback(url)
.pipe(mergeMap(() => Browser.close()))
.subscribe();
}
});
});
}
}
ステップ 5:ログインを実装する
import { Component } from '@angular/core';
import { AuthService } from '@auth0/auth0-angular';
import { Browser } from '@capacitor/browser';
@Component({
selector: 'app-login',
template: `<ion-button (click)="login()">Log In</ion-button>`,
})
export class LoginPage {
constructor(public auth: AuthService) {}
login() {
this.auth
.loginWithRedirect({
async openUrl(url: string) {
await Browser.open({ url, windowName: '_self' });
},
})
.subscribe();
}
}
ステップ 6:ログアウトを実装する
import { Component } from '@angular/core';
import { AuthService } from '@auth0/auth0-angular';
import { Browser } from '@capacitor/browser';
@Component({
selector: 'app-logout-button',
template: `<ion-button (click)="logout()">Log Out</ion-button>`,
})
export class LogoutButtonComponent {
constructor(public auth: AuthService) {}
logout() {
this.auth
.logout({
logoutParams: {
returnTo: `YOUR_PACKAGE_ID://YOUR_AUTH0_DOMAIN/capacitor/YOUR_PACKAGE_ID/callback`,
},
async openUrl(url: string) {
await Browser.open({ url, windowName: '_self' });
},
})
.subscribe();
}
}
ステップ 7:ユーザープロファイルを表示する
import { Component } from '@angular/core';
import { AuthService } from '@auth0/auth0-angular';
import { AsyncPipe } from '@angular/common';
@Component({
selector: 'app-profile',
template: `
<div *ngIf="auth.user$ | async as user">
<img [src]="user.picture" [alt]="user.name" />
<h2>{{ user.name }}</h2>
<p>{{ user.email }}</p>
</div>
`,
})
export class ProfileComponent {
constructor(public auth: AuthService) {}
}
ステップ 8:ビルドしてテストする
エージェントへの指示: すべてのコードを書いた後、ビルドが成功することを確認してください。
npm run build npx cap syncビルドが失敗した場合は、エラーを調査して修正してください(最大 5~6 回繰り返します)。それでも失敗する場合は、
AskUserQuestionを使用してユーザーにサポートを求めてください。
詳細ドキュメント
- セットアップガイド — Auth0 の設定、Auth0 CLI のセットアップ、Capacitor プラットフォームのセットアップ、ディープリンク
- 統合パターン — ログイン/ログアウトのフロー、トークン管理、ユーザープロファイル、エラー処理、Capacitor のライフサイクル
- API リファレンスとテスト — AuthService API、設定オプション、クレームのリファレンス、テストチェックリスト
よくある間違い
| 間違い | 修正方法 |
|---|---|
| Auth0 アプリのタイプが Native ではなく SPA に設定されている | Auth0 ダッシュボードの「Application Settings」で Native に変更します |
| Auth0 ダッシュボードにコールバック URL がない | PACKAGE_ID://{domain}/capacitor/PACKAGE_ID/callback を「Allowed Callback URLs」と「Allowed Logout URLs」の両方に追加します |
handleRedirectCallback を ngZone.run() で囲んでいない | Angular が認証状態の変更を検出できません。必ず ngZone.run() で囲みます |
ログインのリダイレクトに window.location.href を使用している | システムブラウザーには @capacitor/browser の Browser.open() を使用する必要があります |
useRefreshTokens が true に設定されていない | モバイルでは必須です。ネイティブプラットフォームでは localStorage の信頼性が低いためです |
useRefreshTokensFallback が false に設定されていない | iframe ベースのトークン更新(モバイルでは非対応)へのフォールバックを避けるため、false にする必要があります |
ディープリンク用の @capacitor/app リスナーがない | システムブラウザーからのコールバックを処理するには、appUrlOpen リスナーが必要です |
モバイルで loginWithPopup を使用している | ネイティブではポップアップが動作しません。Browser.open と loginWithRedirect を使用します |
| コールバック URL が一致しない(スキームとパッケージ ID) | URL スキームは capacitor.config.ts の appId と完全に一致する必要があります |
WebAuth メソッド
Capacitor を使用する Ionic では、認証に Web Auth メソッドを使用します。
- ユーザーが Log In をタップ → アプリが
Browser.open()を使用するカスタムopenUrlを指定してloginWithRedirectを呼び出します - Capacitor の Browser プラグインが、システムブラウザーで Auth0 Universal Login ページを開きます(SFSafariViewController/Chrome Custom Tabs)
- ユーザーが認証 → Auth0 がカスタム URL スキームのコールバックにリダイレクトします
- OS がディープリンクをアプリに転送 →
appUrlOpenイベントが発生します handleRedirectCallback(url)がngZone.run()内で認証コードの交換を処理しますBrowser.close()がシステムブラウザーを閉じますauth.isAuthenticated$がtrueを通知し、auth.user$がユーザープロファイルを通知します
関連スキル
- auth0-ionic-react — Capacitor を使用する Ionic React
- auth0-ionic-vue — Capacitor を使用する Ionic Vue
- auth0-angular — Angular SPA(ブラウザーのみ)
- auth0-swift — ネイティブ iOS(Swift)
- auth0-android — ネイティブ Android(Kotlin)
クイックリファレンス
| API | 説明 |
|---|---|
AuthService.loginWithRedirect(options) | Capacitor 用にカスタムの openUrl を指定して、ログインフローを開始します |
AuthService.logout(options) | カスタムの openUrl と returnTo を指定して、ログアウトします |
AuthService.handleRedirectCallback(url) | ディープリンクからのコールバック URL を処理します |
AuthService.isAuthenticated$ | Observable の boolean 値 — ユーザーがログインしているかどうか |
AuthService.user$ | Observable — 現在のユーザープロフィール(名前、メールアドレス、画像) |
AuthService.isLoading$ | Observable の boolean 値 — SDK の初期化状態 |
AuthService.error$ | Observable — 認証エラー |
AuthService.getAccessTokenSilently() | アクセストークンを取得します(モバイルではリフレッシュトークンを使用します) |
Browser.open({ url }) | システムブラウザーで URL を開きます(Capacitor) |
CapApp.addListener('appUrlOpen', cb) | ディープリンクのコールバックをリッスンします(Capacitor) |