Migration depuis Auth0
Auris offre une parité de fonctionnalités avec Auth0 en authentification, autorisation et gestion des utilisateurs, plus des fonctionnalités qu’Auth0 facture en supplément ou n’offre pas (FGA style Zanzibar, provisioning SCIM intégré, Actions Engine avec éditeur visuel, et déploiement self-hosted). Ce guide illustre une migration complète d’Auth0 vers Auris avec un downtime minimal.
Mapping des Fonctionnalités
| Fonctionnalité Auth0 | Équivalent Auris | Notes |
|---|---|---|
| Universal Login | Hosted Login Pages | OAuth2 Authorization Code + PKCE, branded par tenant |
| Rules / Actions | Actions Engine | JavaScript sandboxed, 6 points de déclenchement, éditeur visuel Blueprint |
| RBAC (Rôles + Permissions) | Roles & Permissions V2 | Tri-state ALLOW/DENY, scoping par application |
| Organizations | Organizations B2B | Multi-org avec 4 rôles membre, invitations basées sur token |
| Auth0 FGA (OpenFGA) | Auris FGA | ReBAC style Zanzibar, DSL compatible OpenFGA |
| Social Connections | Social Login | 9 fournisseurs (Google, GitHub, Microsoft, Apple, Facebook, Discord, LinkedIn, Twitter/X, Slack) |
| Enterprise Connections (SAML/OIDC) | Enterprise SSO | SAML 2.0 + OIDC via Keycloak IdP brokering, vérification de domaine |
| Machine-to-Machine | Client Credentials | Grant OAuth2 client_credentials, basé sur scope, JWT avec type: 'm2m' |
| Hooks / Webhooks | Webhook | Signés HMAC-SHA256, retry avec backoff exponentiel |
| Custom Claims | Custom JWT Claims | Par application, 5 types de valeur |
| MFA | Multi-Factor Auth | TOTP, SMS OTP, WebAuthn/Passkeys, MFA adaptative avec risk scoring |
| Passwordless (Email) | Magic Links | Connexion email basée sur token avec auto-signup |
| Passwordless (SMS) | SMS OTP | Fournisseur Twilio, rate-limited avec cooldown |
| Attack Protection | Attack Protection | Règles IP, blocage brute-force, CAPTCHA, détection connexions suspectes |
| Log Streaming | Log Streaming | Webhook, S3, Datadog, Splunk |
| User Import/Export | User Import/Export | CSV et JSON, traitement asynchrone avec suivi de progression |
| SCIM | SCIM 2.0 Provisioning | Conforme RFC 7644, mapping d’attributs, opérations bulk |
| Custom Domains | Custom Domains | Pages auth white-label, SSL automatique |
| Rate Limiting | Rate Limiting | 4 niveaux, fenêtre glissante, headers standard |
| Branding | Branding | Logo, couleurs, favicon, nom de l’entreprise |
Étapes de Migration
Étape 1 : Exporter les Utilisateurs depuis Auth0
Utilise l’Auth0 Management API pour exporter tes utilisateurs :
# Créer un job d'export
curl -X POST https://VOTRE_DOMAINE_AUTH0/api/v2/jobs/users-exports \
-H "Authorization: Bearer $AUTH0_MANAGEMENT_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"format": "json",
"fields": [
{ "name": "user_id" },
{ "name": "email" },
{ "name": "email_verified" },
{ "name": "name" },
{ "name": "given_name" },
{ "name": "family_name" },
{ "name": "created_at" },
{ "name": "app_metadata" },
{ "name": "user_metadata" }
]
}'# Vérifier le statut de l'export
curl https://VOTRE_DOMAINE_AUTH0/api/v2/jobs/JOB_ID \
-H "Authorization: Bearer $AUTH0_MANAGEMENT_TOKEN"
# Quand le statut est "completed", télécharge le fichier depuis l'URL locationAuth0 n’exporte pas les hashes de mots de passe pour les utilisateurs qui se sont inscrits avec email/mot de passe. Ces utilisateurs devront réinitialiser leur mot de passe après la migration, ou tu peux utiliser le pattern de migration lazy décrit ci-dessous.
Étape 2 : Transformer et Importer les Utilisateurs dans Auris
Transforme le format d’export Auth0 au format d’import Auris :
// transform-auth0-users.ts
import fs from 'fs'
interface Auth0User {
user_id: string
email: string
email_verified: boolean
name: string
given_name: string
family_name: string
created_at: string
app_metadata: Record<string, unknown>
user_metadata: Record<string, unknown>
}
interface AurisImportUser {
email: string
firstName: string
lastName: string
emailVerified: boolean
}
const auth0Users: Auth0User[] = JSON.parse(
fs.readFileSync('auth0-export.json', 'utf-8')
)
const aurisUsers: AurisImportUser[] = auth0Users.map((user) => ({
email: user.email,
firstName: user.given_name || user.name?.split(' ')[0] || '',
lastName: user.family_name || user.name?.split(' ').slice(1).join(' ') || '',
emailVerified: user.email_verified,
}))
fs.writeFileSync('auris-import.json', JSON.stringify(aurisUsers, null, 2))
console.log(`${aurisUsers.length} utilisateurs transformés`)Importe dans Auris :
curl -X POST https://auth.votredomaine.com/api/users/import \
-H "Authorization: Bearer $AURIS_ACCESS_TOKEN" \
-H "x-tenant: votre-tenant-id" \
-F "[email protected]" \
-F "format=json"Étape 3 : Créer les Applications dans la Console Auris
Pour chaque Application Auth0, crée une Application correspondante dans Auris :
- Ouvre Console puis Applications puis Créer une Application
- Définis le Type d’Application pour correspondre au type Auth0 :
- Auth0 “Single Page Application” ou “Regular Web Application” = Auris WEB
- Auth0 “Native” = Auris MOBILE
- Auth0 “Machine to Machine” = Auris M2M
- Configure les URLs de Callback Autorisées avec les mêmes redirect URIs qu’Auth0
- Configure les Origines Autorisées avec les mêmes origines qu’Auth0
- Note le nouveau Client ID (et le Client Secret pour les apps M2M)
Étape 4 : Remplacer le SDK Auth0 par le SDK Auris
Installe le SDK Auris et supprime le SDK Auth0 :
# Supprimer Auth0
npm uninstall @auth0/auth0-spa-js @auth0/auth0-react @auth0/nextjs-auth0
# Installer Auris
npm install @auris/js @auris/react
# Pour Next.js :
npm install @auris/nextjsÉtape 5 : Mettre à Jour le Code de l’Application
L’API du SDK Auris est intentionnellement similaire à celle d’Auth0 pour minimiser l’effort de migration.
Configuration Provider (React) :
// AVANT (Auth0)
import { Auth0Provider } from '@auth0/auth0-react'
function App() {
return (
<Auth0Provider
domain="votre-tenant.auth0.com"
clientId="auth0-client-id"
authorizationParams={{
redirect_uri: window.location.origin + '/callback',
}}
>
<MyApp />
</Auth0Provider>
)
}
// APRÈS (Auris)
import { AurisProvider } from '@auris/react'
function App() {
return (
<AurisProvider
domain="auth.votreentreprise.com"
clientId="auris-client-id"
redirectUri={window.location.origin + '/callback'}
>
<MyApp />
</AurisProvider>
)
}Hook d’Authentification :
// AVANT (Auth0)
const { loginWithRedirect, logout, user, isAuthenticated, isLoading, getAccessTokenSilently } = useAuth0()
// APRÈS (Auris)
const { loginWithRedirect, logout, user, isAuthenticated, isLoading, getAccessToken } = useAuris()
// Le logout est légèrement différent :
// Auth0: logout({ logoutParams: { returnTo: window.location.origin } })
// Auris: logout({ returnTo: window.location.origin })Appels API avec Access Token :
// AVANT (Auth0)
const token = await getAccessTokenSilently()
// APRÈS (Auris)
const token = await getAccessToken()
// Le reste du code API reste inchangé
const response = await fetch('/api/protected', {
headers: { Authorization: `Bearer ${token}` },
})Vérification des Permissions (React) :
// AVANT (Auth0 — vérification manuelle du claim)
const { user } = useAuth0()
const hasPermission = user?.['https://myapp.com/permissions']?.includes('read:data')
// APRÈS (Auris — hook de permissions intégré)
import { useCheckPermission } from '@auris/react'
const canReadData = useCheckPermission('read:data')Middleware Next.js :
// AVANT (Auth0)
import { withMiddlewareAuthRequired } from '@auth0/nextjs-auth0/edge'
export default withMiddlewareAuthRequired()
// APRÈS (Auris)
import { aurisMiddleware } from '@auris/nextjs/middleware'
export default aurisMiddleware({
protectedPaths: ['/dashboard(.*)'],
publicPaths: ['/', '/about', '/pricing'],
loginUrl: '/auth/login',
})Étape 6 : Mettre à Jour les Redirect URIs
Mets à jour les Callback URLs dans l’application Auris pour correspondre à ce que ton app envoie :
- Remplace
https://votre-tenant.auth0.com/parhttps://auth.votreentreprise.com/dans tous les redirect URIs
Étape 7 : Migrer les Rules vers les Actions
Les Rules et Actions Auth0 se mappent aux déclencheurs de l’Actions Engine Auris :
| Déclencheur Auth0 | Déclencheur Auris |
|---|---|
post-login | post-login |
pre-user-registration | pre-signup |
post-user-registration | post-signup |
post-change-password | post-change-password |
Exemple d’Action Auth0 :
// Auth0 Action (post-login)
exports.onExecutePostLogin = async (event, api) => {
if (!event.user.email_verified) {
api.access.deny('Vérifie ton e-mail avant d\'accéder.')
}
api.idToken.setCustomClaim('https://myapp.com/role', event.user.app_metadata.role)
}Équivalent Auris Action :
// Auris Action (déclencheur post-login)
async function action(context) {
if (!context.user.emailVerified) {
return { deny: true, message: 'Vérifie ton e-mail avant d\'accéder.' }
}
return {
claims: {
role: context.user.metadata?.role || 'user'
}
}
}Étape 8 : Migrer l’RBAC
Exporte les rôles et permissions depuis Auth0 et recrée-les dans Auris :
# Lister les rôles Auth0
curl https://VOTRE_DOMAINE_AUTH0/api/v2/roles \
-H "Authorization: Bearer $AUTH0_MANAGEMENT_TOKEN"Pour chaque rôle, crée-le dans Auris :
curl -X POST https://auth.votredomaine.com/api/roles \
-H "Authorization: Bearer $AURIS_ACCESS_TOKEN" \
-H "x-tenant: votre-tenant-id" \
-H "Content-Type: application/json" \
-d '{
"name": "Éditeur",
"description": "Peut modifier les contenus",
"color": "#3B82F6"
}'Auris supporte les permissions tri-state (ALLOW/DENY) qui sont plus granulaires que le modèle binaire d’Auth0.
Étape 9 : DNS Cutover
Une fois tout testé :
- Configure un domaine personnalisé dans Auris (ex.
auth.votreentreprise.com) - Mets à jour le DNS pour pointer ton domaine d’authentification vers Auris
- Mets à jour toutes les applications pour utiliser le nouveau domaine
- Surveille les logs d’audit Auris pendant les premières heures après le cutover
Gestion des Mots de Passe (Migration Lazy)
Puisqu’Auth0 n’exporte pas les hashes de mots de passe, tu as deux options :
Option A : Forcer la Réinitialisation du Mot de Passe (Plus Simple)
Après avoir importé les utilisateurs, déclenche un e-mail de réinitialisation de mot de passe en masse :
- Tous les utilisateurs importés reçoivent un e-mail “Définis ton mot de passe”
- Les utilisateurs cliquent le lien et définissent un nouveau mot de passe sur Auris
- Aucune modification du code de l’application requise
Option B : Migration Lazy (Zéro Friction)
Fais tourner Auth0 et Auris en parallèle temporairement. Quand un utilisateur se connecte :
- Auris tente d’authentifier l’utilisateur
- Si l’utilisateur n’a pas de mot de passe dans Auris (importé sans), Auris retourne une erreur spécifique
- Ton application intercepte cette erreur et tente l’authentification sur Auth0 comme fallback
- Si Auth0 réussit, ton application crée le mot de passe dans Auris via l’Admin API
- Les connexions suivantes passent directement par Auris
Cette approche migre les mots de passe de façon transparente au fur et à mesure que les utilisateurs se connectent, avec zéro friction.
Le pattern de migration lazy nécessite de maintenir le tenant Auth0 actif pendant la période de migration. Planifie sa désactivation après une période raisonnable (ex. 30-90 jours) quand la plupart des utilisateurs actifs ont migré.
Plan de Rollback
En cas de problèmes pendant la migration :
- Maintiens Auth0 actif pendant au moins 30 jours après le cutover
- Rollback DNS : Redirige ton domaine d’authentification vers Auth0
- Rollback SDK : Restaure les packages
@auris/*avec@auth0/*dans le code et redéploie - Aucune perte de données : Les utilisateurs créés dans Auris pendant la migration peuvent être exportés et réimportés dans Auth0
Checklist Post-Migration
Après avoir terminé la migration, vérifie :
- Tous les utilisateurs peuvent se connecter (teste avec plusieurs comptes)
- Les fournisseurs de connexion sociale fonctionnent (Google, GitHub, etc.)
- L’inscription et la vérification MFA fonctionnent
- Le contrôle d’accès basé sur les rôles est appliqué correctement
- Les webhooks livrent des événements à tes endpoints
- Le log streaming est actif (si configuré)
- Les domaines personnalisés et SSL fonctionnent
- Les applications mobiles (si présentes) sont mises à jour avec le nouveau SDK
- Les applications M2M peuvent obtenir des tokens
- Le provisioning SCIM est connecté (si utilisé)
Guides Associés
- Connexion Hébergée (PKCE) — Implémenter le flux de connexion
- Rôles et Permissions — Configurer l’RBAC
- Autorisation Fine-Grained — Migrer depuis Auth0 FGA
- Import/Export Utilisateurs — Migration d’utilisateurs en masse
- Domaines Personnalisés — White-label des pages d’authentification
- Migration depuis Firebase — Guide de migration alternatif