次のような場合に使用: Ionic React アプリ(Capacitor対応)に Auth0 ログイン、ログアウト、またはディープリンキング(特定ページへの直接リンク)機能を組み込む必要があるとき。 @auth0/auth0-react ライブラリを Capacitor の Browser・App プラグイン(iOSやAndroidネイティブ機能を利用するための拡張機能)と統合します。
Use when adding Auth0 login, logout, or deep linking to an Ionic React app with Capacitor. Integrates @auth0/auth0-react with Capacitor Browser and App plugins for native iOS/Android.
Capacitorを使用したIonic ReactアプリケーションにAuth0認証を追加します。
このスキルは、iOSおよびAndroidのディープリンク処理に対応したネイティブモバイル認証を対象とし、
@auth0/auth0-react SDKと @capacitor/browser・@capacitor/app pluginを組み合わせて使用します。
npm install -g @ionic/cli)brew install auth0/auth0-cli/auth0| ユースケース | 推奨スキル |
|---|---|
| React SPA(Capacitor/Ionicなし) | auth0-react |
| React Native(bare CLI) | auth0-react-native |
| Expo(React Native) | auth0-expo |
| Ionic + Angular + Capacitor | auth0-ionic-angular |
| Ionic + Vue + Capacitor | auth0-ionic-vue |
| Next.js(サーバーサイド) | auth0-nextjs |
| iOSネイティブ(Swift) | auth0-swift |
| Androidネイティブ(Kotlin) | auth0-android |
Auth0 CLIを使った自動セットアップについては、完全なスクリプトが記載されたセットアップガイドを参照してください。
手動セットアップの場合は、Auth0 DashboardでNativeアプリケーションを設定し、DomainとClient IDを控えておきます。
npm install @auth0/auth0-react @capacitor/browser @capacitor/app
npx cap sync
Capacitor向けに設定したAuth0Providerでアプリのルートをラップします。
src/main.tsxに以下を記述します:
import React from 'react';
import { createRoot } from 'react-dom/client';
import { Auth0Provider } from '@auth0/auth0-react';
import App from './App';
const domain = import.meta.env.VITE_AUTH0_DOMAIN;
const clientId = import.meta.env.VITE_AUTH0_CLIENT_ID;
const packageId = import.meta.env.VITE_AUTH0_PACKAGE_ID; // 例: com.example.myapp
const redirectUri = `${packageId}://${domain}/capacitor/${packageId}/callback`;
createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Auth0Provider
domain={domain}
clientId={clientId}
useRefreshTokens={true}
useRefreshTokensFallback={false}
authorizationParams={{
redirect_uri: redirectUri
}}
>
<App />
</Auth0Provider>
</React.StrictMode>
);
import { useAuth0 } from '@auth0/auth0-react';
import { Browser } from '@capacitor/browser';
const { loginWithRedirect } = useAuth0();
const login = async () => {
await loginWithRedirect({
async openUrl(url) {
await Browser.open({ url, windowName: "_self" });
}
});
};
import { useEffect } from 'react';
import { App as CapApp } from '@capacitor/app';
import { Browser } from '@capacitor/browser';
import { useAuth0 } from '@auth0/auth0-react';
const { handleRedirectCallback } = useAuth0();
useEffect(() => {
const listener = CapApp.addListener('appUrlOpen', async ({ url }) => {
if (url.includes('state') && (url.includes('code') || url.includes('error'))) {
await handleRedirectCallback(url);
}
await Browser.close();
});
return () => {
listener.then(l => l.remove());
};
}, [handleRedirectCallback]);
const doLogout = async () => {
await logout({
logoutParams: {
returnTo: `${packageId}://${domain}/capacitor/${packageId}/callback`
},
async openUrl(url) {
await Browser.open({ url, windowName: "_self" });
}
});
};
Agentへの指示: 統合後、以下でビルドを確認してください:
ionic build npx cap synciOS向け:
npx cap open iosを実行後、Xcodeでビルドします。 Android向け:npx cap open androidを実行後、Android Studioでビルドします。 ビルドが失敗した場合は、5〜6回繰り返して問題を修正してください。 それでも失敗する場合は、AskUserQuestionを使ってサポートを要請してください。
| 間違い | 修正方法 |
|---|---|
| Auth0 DashboardでアプリタイプがNativeに設定されていない | Dashboardの設定でアプリケーションタイプを「Native」に変更する |
| コールバックURLの形式が欠落または不正 | YOUR_PACKAGE_ID://YOUR_DOMAIN/capacitor/YOUR_PACKAGE_ID/callback の形式を使用し、完全に一致させること |
| リフレッシュトークンが有効化されていない | Auth0Providerに useRefreshTokens={true} と useRefreshTokensFallback={false} を設定する |
@capacitor/browser または @capacitor/app が未インストール |
両方をインストールする: npm install @capacitor/browser @capacitor/app && npx cap sync |
| ディープリンクコールバックが処理されていない | CapApp.addListener('appUrlOpen', ...) を追加してAuth0リダイレクトを処理する |
インストール後に npx cap sync を忘れる |
Capacitor pluginのインストール後は必ず npx cap sync を実行すること |
リダイレクトURIに window.location.origin を使用している |
http://localhost ではなく、カスタムURLスキーム(packageId://domain/...)を使用すること |
| DashboardのAllowed Originsが未設定 | Allowed Originsに capacitor://localhost, http://localhost を追加する |
| モバイルでlocalStorageが永続的に扱われている | 信頼性の高いトークン永続化のためにリフレッシュトークンを使用する(useRefreshTokens={true}) |
| iOS SSOが機能しない | iOS 11以降、SFSafariViewControllerはSafariとCookieを共有しないため、これは仕様通りの動作 |
| 実機でテストしていない | 認証フローは必ず実機でテストすること。シミュレータではディープリンクが正しく処理されない場合がある |
このSDKは、Capacitor Browser pluginを通じてAuth0のUniversal Login(WebAuth)を使用します。
loginWithRedirect() メソッドは、Auth0の認可エンドポイントをシステムブラウザ
(iOS上のSFSafariViewController、Android上のChrome Custom Tabs)で開きます。
認証後、Auth0はカスタムスキームを使ったネイティブコールバックURL
{packageId}://{domain}/capacitor/{packageId}/callback を通じてアプリにリダイレクトします。
@capacitor/app pluginがこのディープリンクをキャプチャし、
handleRedirectCallback(url) が認可コードの交換処理を行います。
https://{domain}/android/{packageId}/callback や https://{domain}/ios/{bundleId}/callback
を使用する標準のネイティブSDKとは異なり、Ionic CapacitorアプリはパッケージIDをURLスキームとして使用する
Capacitor固有のコールバックパスを採用します。
| API | 説明 |
|---|---|
Auth0Provider |
コンテキストプロバイダー — Auth0設定でアプリのルートをラップする |
useAuth0() |
フック — { isLoading, isAuthenticated, user, loginWithRedirect, logout, getAccessTokenSilently, handleRedirectCallback } を返す |
loginWithRedirect({ openUrl }) |
Universal Login経由でログイン — openUrl コールバック内で Browser.open() を使用する |
logout({ logoutParams, openUrl }) |
ログアウト — openUrl コールバック内で Browser.open() を使用する |
handleRedirectCallback(url) |
ディープリンクから受け取ったAuth0コールバックURLを処理する |
getAccessTokenSilently() |
アクセストークンを取得する(モバイルではリフレッシュトークンを使用) |
withAuthenticationRequired(Component) |
ルートを保護するためのHOC |
Browser.open({ url }) |
Capacitor — URLをシステムブラウザ(SFSafariViewController / Chrome Custom Tabs)で開く |
CapApp.addListener('appUrlOpen', cb) |
Capacitor — ディープリンクイベントをリッスンする |
Browser.close() |
Capacitor — コールバック後にアプリ内ブラウザを閉じる |
Add Auth0 authentication to Ionic React applications using Capacitor. This skill covers native mobile authentication using the @auth0/auth0-react SDK combined with @capacitor/browser and @capacitor/app plugins for deep link handling on iOS and Android.
npm install -g @ionic/cli)brew install auth0/auth0-cli/auth0| Use Case | Recommended Skill |
|---|---|
| React SPA (no Capacitor/Ionic) | auth0-react |
| React Native (bare CLI) | auth0-react-native |
| Expo (React Native) | auth0-expo |
| Ionic + Angular + Capacitor | auth0-ionic-angular |
| Ionic + Vue + Capacitor | auth0-ionic-vue |
| Next.js (server-side) | auth0-nextjs |
| iOS native (Swift) | auth0-swift |
| Android native (Kotlin) | auth0-android |
For automated setup with Auth0 CLI, see Setup Guide for complete scripts.
For manual setup, configure a Native application in the Auth0 Dashboard and note your Domain and Client ID.
npm install @auth0/auth0-react @capacitor/browser @capacitor/app
npx cap sync
Wrap the app root with Auth0Provider, configuring it for Capacitor. In src/main.tsx:
import React from 'react';
import { createRoot } from 'react-dom/client';
import { Auth0Provider } from '@auth0/auth0-react';
import App from './App';
const domain = import.meta.env.VITE_AUTH0_DOMAIN;
const clientId = import.meta.env.VITE_AUTH0_CLIENT_ID;
const packageId = import.meta.env.VITE_AUTH0_PACKAGE_ID; // e.g., com.example.myapp
const redirectUri = `${packageId}://${domain}/capacitor/${packageId}/callback`;
createRoot(document.getElementById('root')!).render(
<React.StrictMode>
<Auth0Provider
domain={domain}
clientId={clientId}
useRefreshTokens={true}
useRefreshTokensFallback={false}
authorizationParams={{
redirect_uri: redirectUri
}}
>
<App />
</Auth0Provider>
</React.StrictMode>
);
import { useAuth0 } from '@auth0/auth0-react';
import { Browser } from '@capacitor/browser';
const { loginWithRedirect } = useAuth0();
const login = async () => {
await loginWithRedirect({
async openUrl(url) {
await Browser.open({ url, windowName: "_self" });
}
});
};
import { useEffect } from 'react';
import { App as CapApp } from '@capacitor/app';
import { Browser } from '@capacitor/browser';
import { useAuth0 } from '@auth0/auth0-react';
const { handleRedirectCallback } = useAuth0();
useEffect(() => {
const listener = CapApp.addListener('appUrlOpen', async ({ url }) => {
if (url.includes('state') && (url.includes('code') || url.includes('error'))) {
await handleRedirectCallback(url);
}
await Browser.close();
});
return () => {
listener.then(l => l.remove());
};
}, [handleRedirectCallback]);
const doLogout = async () => {
await logout({
logoutParams: {
returnTo: `${packageId}://${domain}/capacitor/${packageId}/callback`
},
async openUrl(url) {
await Browser.open({ url, windowName: "_self" });
}
});
};
Agent instruction: After integration, verify the build:
ionic build npx cap syncFor iOS:
npx cap open iosthen build in Xcode. For Android:npx cap open androidthen build in Android Studio. If the build fails, iterate up to 5-6 times to fix issues. If still failing, useAskUserQuestionto request help.
| Mistake | Fix |
|---|---|
| App type not set to Native in Auth0 Dashboard | Change application type to "Native" in Dashboard settings |
| Missing or incorrect callback URL format | Use YOUR_PACKAGE_ID://YOUR_DOMAIN/capacitor/YOUR_PACKAGE_ID/callback — must match exactly |
| Not enabling refresh tokens | Set useRefreshTokens={true} and useRefreshTokensFallback={false} on Auth0Provider |
Missing @capacitor/browser or @capacitor/app |
Install both: npm install @capacitor/browser @capacitor/app && npx cap sync |
| Not handling deep link callback | Add CapApp.addListener('appUrlOpen', ...) to process Auth0 redirect |
Forgetting npx cap sync after install |
Always run npx cap sync after installing Capacitor plugins |
Using window.location.origin as redirect URI |
Use the custom URL scheme (packageId://domain/...), not http://localhost |
| Missing Allowed Origins in Dashboard | Add capacitor://localhost, http://localhost to Allowed Origins |
| localStorage treated as persistent on mobile | Use refresh tokens (useRefreshTokens={true}) for reliable token persistence |
| iOS SSO not working | SFSafariViewController doesn't share cookies with Safari on iOS 11+; this is expected |
| Not testing on physical device | Always test auth flows on a physical device; simulators may not handle deep links correctly |
This SDK uses Auth0's Universal Login (WebAuth) via the Capacitor Browser plugin. The loginWithRedirect() method opens the Auth0 authorization endpoint in a system browser (SFSafariViewController on iOS, Chrome Custom Tabs on Android). After authentication, Auth0 redirects back to the app using a native callback URL with a custom scheme: {packageId}://{domain}/capacitor/{packageId}/callback. The @capacitor/app plugin captures this deep link, and handleRedirectCallback(url) processes the authorization code exchange.
Unlike standard native SDKs that use https://{domain}/android/{packageId}/callback or https://{domain}/ios/{bundleId}/callback, Ionic Capacitor apps use the Capacitor-specific callback path with the package ID as the URL scheme.
| API | Description |
|---|---|
Auth0Provider |
Context provider — wraps app root with Auth0 config |
useAuth0() |
Hook — returns { isLoading, isAuthenticated, user, loginWithRedirect, logout, getAccessTokenSilently, handleRedirectCallback } |
loginWithRedirect({ openUrl }) |
Login via Universal Login — use Browser.open() in openUrl callback |
logout({ logoutParams, openUrl }) |
Logout — use Browser.open() in openUrl callback |
handleRedirectCallback(url) |
Process Auth0 callback URL from deep link |
getAccessTokenSilently() |
Get access token (uses refresh tokens on mobile) |
withAuthenticationRequired(Component) |
HOC to protect routes |
Browser.open({ url }) |
Capacitor — opens URL in system browser (SFSafariViewController / Chrome Custom Tabs) |
CapApp.addListener('appUrlOpen', cb) |
Capacitor — listens for deep link events |
Browser.close() |
Capacitor — closes the in-app browser after callback |
原文・著作権は Anthropic および各プラグイン作者に帰属します。日本語訳は Claude API による自動翻訳です。