auth0-ionic-vue

Par auth0 · agent-skills

À utiliser lors de l'ajout de l'authentification Auth0 à une application Ionic Vue avec Capacitor — intègre le SDK @auth0/auth0-vue avec les plugins Capacitor Browser et App pour la gestion des deep links natifs iOS/Android, la connexion, la déconnexion et l'affichage du profil utilisateur.

npx skills add https://github.com/auth0/agent-skills --skill auth0-ionic-vue

Intégration Auth0 Ionic Vue (Capacitor)

Ajoutez l'authentification Auth0 aux applications Ionic Vue utilisant Capacitor. Cette skill couvre l'authentification mobile native en utilisant le SDK @auth0/auth0-vue combiné aux plugins @capacitor/browser et @capacitor/app pour la gestion des deep links sur iOS et Android.

Agent instruction: Avant de fournir les instructions de configuration du SDK, récupérez la dernière version de release en exécutant :

gh api repos/auth0/auth0-vue/releases/latest --jq '.tag_name'

Utilisez la version retournée dans toutes les lignes de dépendances au lieu de toute version codée en dur ci-dessous.

Prérequis

  • Node.js 18+
  • Ionic CLI (npm install -g @ionic/cli)
  • Une application Ionic Vue existante avec Capacitor configuré
  • Compte et tenant Auth0
  • Pour iOS : Xcode 14+ et CocoaPods
  • Pour Android : Android Studio avec API level 21+
  • Auth0 CLI — brew install auth0/auth0-cli/auth0

Quand NE PAS utiliser

Cas d'usage Skill recommandée
Vue SPA (sans Capacitor/Ionic) auth0-vue
React SPA (sans Capacitor/Ionic) auth0-react
React Native (CLI bare) auth0-react-native
Expo (React Native) auth0-expo
Ionic + React + Capacitor auth0-ionic-react
Ionic + Angular + Capacitor auth0-ionic-angular
Next.js (côté serveur) auth0-nextjs
Nuxt (côté serveur) auth0-nuxt
iOS native (Swift) auth0-swift
Android native (Kotlin) auth0-android

Flux de démarrage rapide

Agent instruction: Suivez ces étapes dans l'ordre. Si le prompt de l'utilisateur fournit déjà les identifiants Auth0 (domain, client ID), utilisez-les directement — ignorez la configuration CLI. Quand les identifiants manquent, utilisez toujours l'Auth0 CLI pour créer l'application.

Agent instruction: Vérifiez si la codebase contient déjà un provider ou un wrapper d'auth existant. Recherchez les gestionnaires de login/logout existants, les boutons d'auth ou l'interface utilisateur liée à l'authentification à réutiliser. Si trouvés, intégrez Auth0 dans ces composants existants plutôt que d'en créer de nouveaux.

Étape 1 : Connexion Auth0 CLI et configuration de l'application

Agent instruction:

  • Si les identifiants Auth0 (domain ET client ID) sont déjà dans le prompt de l'utilisateur: Utilisez-les directement et passez à l'étape 2.
  • Si aucun identifiant n'est fourni: Suivez la configuration automatisée dans Setup Guide — Auth0 CLI Automated Setup pour :
    1. Vérifiez que l'Auth0 CLI est installé (installez si manquant).
    2. Vérifiez que l'utilisateur est connecté à l'Auth0 CLI (proposez d'exécuter auth0 login si nécessaire).
    3. Détectez le domain du tenant Auth0 actif.
    4. Lisez capacitor.config.ts pour obtenir l'ID de package de l'application.
    5. Créez une application Auth0 Native via auth0 apps create avec les bonnes callback URLs.
    6. Extrayez client_id et domain de la sortie CLI.
    7. Écrivez .env avec VITE_AUTH0_DOMAIN, VITE_AUTH0_CLIENT_ID et VITE_AUTH0_CALLBACK_URI.
    8. Mettez à jour src/main.ts pour lire les identifiants de import.meta.env.

N'INVITEZ PAS l'utilisateur à créer ou configurer manuellement une application Auth0. Utilisez toujours le chemin CLI.

Étape 2 : Installer les dépendances

npm install @auth0/auth0-vue @capacitor/browser @capacitor/app
npx cap sync

Étape 3 : Configurer le plugin Auth0

Agent instruction: Si l'étape 1 a déjà écrit .env et mis à jour src/main.ts, vérifiez que la configuration semble correcte et passez à l'étape 4. Utilisez uniquement le template ci-dessous si vous configurez manuellement.

Enregistrez le plugin Auth0 Vue dans le point d'entrée de votre application (src/main.ts), en le configurant pour Capacitor. Les identifiants sont lus depuis .env via import.meta.env :

import { createApp } from 'vue';
import { createAuth0 } from '@auth0/auth0-vue';
import { IonicVue } from '@ionic/vue';
import App from './App.vue';
import router from './router';

// Agent: lisez appId depuis capacitor.config.ts et remplacez cette valeur
const packageId = "YOUR_PACKAGE_ID";

const app = createApp(App);

app.use(IonicVue);
app.use(router);
app.use(
  createAuth0({
    domain: import.meta.env.VITE_AUTH0_DOMAIN,
    clientId: import.meta.env.VITE_AUTH0_CLIENT_ID,
    useRefreshTokens: true,
    useRefreshTokensFallback: false,
    authorizationParams: {
      redirect_uri: `${packageId}://${import.meta.env.VITE_AUTH0_DOMAIN}/capacitor/${packageId}/callback`
    }
  })
);

router.isReady().then(() => {
  app.mount('#app');
});

Étape 4 : Implémenter la connexion avec Capacitor Browser

<script setup lang="ts">
import { useAuth0 } from '@auth0/auth0-vue';
import { Browser } from '@capacitor/browser';
import { IonButton } from '@ionic/vue';

const { loginWithRedirect } = useAuth0();

const login = async () => {
  await loginWithRedirect({
    async openUrl(url: string) {
      await Browser.open({ url, windowName: "_self" });
    }
  });
};
</script>

<template>
  <ion-button @click="login">Log in</ion-button>
</template>

Étape 5 : Gérer le callback via Deep Link

Gérez le callback du deep link dans votre composant App.vue. Cela doit s'exécuter à l'initialisation de l'application :

<script setup lang="ts">
import { onMounted, onUnmounted } from 'vue';
import { useAuth0 } from '@auth0/auth0-vue';
import { App as CapApp } from '@capacitor/app';
import { Browser } from '@capacitor/browser';
import { IonApp, IonRouterOutlet } from '@ionic/vue';

const { handleRedirectCallback } = useAuth0();

let urlOpenListener: { remove: () => void } | undefined;

onMounted(async () => {
  urlOpenListener = await CapApp.addListener('appUrlOpen', async ({ url }) => {
    if (url.includes('state') && (url.includes('code') || url.includes('error'))) {
      await handleRedirectCallback(url);
    }
    await Browser.close();
  });
});

onUnmounted(() => {
  urlOpenListener?.remove();
});
</script>

<template>
  <ion-app>
    <ion-router-outlet />
  </ion-app>
</template>

Étape 6 : Implémenter la déconnexion

<script setup lang="ts">
import { useAuth0 } from '@auth0/auth0-vue';
import { Browser } from '@capacitor/browser';
import { IonButton } from '@ionic/vue';

const domain = import.meta.env.VITE_AUTH0_DOMAIN;
// Agent: lisez appId depuis capacitor.config.ts et remplacez cette valeur
const packageId = "YOUR_PACKAGE_ID";
const logoutUri = `${packageId}://${domain}/capacitor/${packageId}/callback`;

const { logout } = useAuth0();

const doLogout = async () => {
  await logout({
    logoutParams: {
      returnTo: logoutUri
    },
    async openUrl(url: string) {
      await Browser.open({ url, windowName: "_self" });
    }
  });
};
</script>

<template>
  <ion-button @click="doLogout">Log out</ion-button>
</template>

Étape 7 : Compiler et tester

Agent instruction: Après l'intégration, vérifiez la compilation :

ionic build
npx cap sync

Pour iOS : npx cap open ios puis compilez dans Xcode. Pour Android : npx cap open android puis compilez dans Android Studio. Si la compilation échoue, itérez jusqu'à 5-6 fois pour corriger les problèmes. Si toujours en échec, utilisez AskUserQuestion pour demander de l'aide.

Documentation détaillée

  • Setup Guide — Configuration automatisée Auth0 CLI (connexion, création d'application, injection de credentials), enregistrement du schéma URL Capacitor, gestion des secrets
  • Integration Patterns — Login/logout avec Capacitor Browser, gestion du callback deep link, profil utilisateur, routes protégées, accès aux tokens, gestion des erreurs
  • Testing & Reference — Référence API complète pour les options createAuth0, composable useAuth0, configuration des plugins Capacitor, liste de contrôle des tests, problèmes courants

Erreurs courantes

Erreur Solution
Type d'application pas défini sur Native dans Auth0 Dashboard Changez le type d'application en "Native" dans les paramètres du Dashboard
Format de callback URL manquant ou incorrect Utilisez YOUR_PACKAGE_ID://YOUR_DOMAIN/capacitor/YOUR_PACKAGE_ID/callback — doit correspondre exactement
Refresh tokens non activés Définissez useRefreshTokens: true et useRefreshTokensFallback: false dans createAuth0()
@capacitor/browser ou @capacitor/app manquants Installez les deux : npm install @capacitor/browser @capacitor/app && npx cap sync
Callback deep link non géré Ajoutez CapApp.addListener('appUrlOpen', ...) pour traiter la redirection Auth0
npx cap sync oublié après installation Exécutez toujours npx cap sync après avoir installé les plugins Capacitor
Utilisation de window.location.origin comme redirect URI Utilisez le schéma URL personnalisé (packageId://domain/...), pas http://localhost
Allowed Origins manquantes dans le Dashboard Ajoutez capacitor://localhost, http://localhost aux Allowed Origins
app.use(createAuth0(...)) non appelé avant mount Enregistrez le plugin Auth0 avant d'appeler app.mount('#app')
Accès incorrect à .value sur les refs d'auth useAuth0() retourne des Vue refs — utilisez .value dans <script>, template déverrouille automatiquement
localStorage traité comme persistant sur mobile Utilisez les refresh tokens (useRefreshTokens: true) pour une persistance fiable des tokens

Méthode WebAuth

Ce SDK utilise Auth0 Universal Login (WebAuth) via le plugin Capacitor Browser. La méthode loginWithRedirect() ouvre le endpoint d'autorisation Auth0 dans un navigateur système (SFSafariViewController sur iOS, Chrome Custom Tabs sur Android). Après l'authentification, Auth0 redirige vers l'application en utilisant une callback URL native avec un schéma personnalisé : {packageId}://{domain}/capacitor/{packageId}/callback. Le plugin @capacitor/app capture ce deep link, et handleRedirectCallback(url) traite l'échange du code d'autorisation.

Contrairement aux SDKs natifs standard qui utilisent https://{domain}/android/{packageId}/callback ou https://{domain}/ios/{bundleId}/callback, les applications Ionic Capacitor utilisent le chemin de callback spécifique à Capacitor avec l'ID de package comme schéma URL.

Skills connexes

  • auth0-vue — Vue SPA (navigateur uniquement, sans Capacitor)
  • auth0-ionic-react — Ionic avec React et Capacitor
  • auth0-ionic-angular — Ionic avec Angular et Capacitor
  • auth0-react-native — React Native (CLI bare, sans Ionic/Capacitor)
  • auth0-expo — Expo (React Native) avec Auth0

Référence rapide

API Description
createAuth0(options) Factory du plugin Vue — enregistre Auth0 avec app.use()
useAuth0() Composable — retourne { isLoading, isAuthenticated, user, loginWithRedirect, logout, getAccessTokenSilently, handleRedirectCallback, error }
loginWithRedirect({ openUrl }) Connexion via Universal Login — utilisez Browser.open() dans le callback openUrl
logout({ logoutParams, openUrl }) Déconnexion — utilisez Browser.open() dans le callback openUrl
handleRedirectCallback(url) Traite la callback URL Auth0 depuis le deep link
getAccessTokenSilently() Obtient le token d'accès (utilise les refresh tokens sur mobile)
createAuthGuard(app) Factory de navigation guard Vue Router pour les routes protégées
Browser.open({ url }) Capacitor — ouvre l'URL dans le navigateur système (SFSafariViewController / Chrome Custom Tabs)
CapApp.addListener('appUrlOpen', cb) Capacitor — écoute les événements de deep link
Browser.close() Capacitor — ferme le navigateur in-app après la callback

Références

Skills similaires