Migrazione da Auth0
Auris offre parità di funzionalità con Auth0 in autenticazione, autorizzazione e gestione utenti, più funzionalità che Auth0 fa pagare a parte o non offre (FGA stile Zanzibar, provisioning SCIM integrato, Actions Engine con editor visuale, e deployment self-hosted). Questa guida illustra una migrazione completa da Auth0 ad Auris con downtime minimo.
Mappatura delle Funzionalità
| Funzionalità Auth0 | Equivalente Auris | Note |
|---|---|---|
| Universal Login | Hosted Login Pages | OAuth2 Authorization Code + PKCE, branded per tenant |
| Rules / Actions | Actions Engine | JavaScript sandboxed, 6 trigger point, editor visuale Blueprint |
| RBAC (Ruoli + Permessi) | Roles & Permissions V2 | Tri-state ALLOW/DENY, scoping per applicazione |
| Organizations | Organizations B2B | Multi-org con 4 ruoli membro, inviti basati su token |
| Auth0 FGA (OpenFGA) | Auris FGA | ReBAC stile Zanzibar, DSL compatibile con OpenFGA |
| Social Connections | Social Login | 9 provider (Google, GitHub, Microsoft, Apple, Facebook, Discord, LinkedIn, Twitter/X, Slack) |
| Enterprise Connections (SAML/OIDC) | Enterprise SSO | SAML 2.0 + OIDC tramite Keycloak IdP brokering, verifica dominio |
| Machine-to-Machine | Client Credentials | Grant OAuth2 client_credentials, basato su scope, JWT con type: 'm2m' |
| Hooks / Webhooks | Webhook | Firmati HMAC-SHA256, retry con backoff esponenziale |
| Custom Claims | Custom JWT Claims | Per applicazione, 5 tipi di valore |
| MFA | Multi-Factor Auth | TOTP, SMS OTP, WebAuthn/Passkeys, MFA adattivo con risk scoring |
| Passwordless (Email) | Magic Links | Login email basato su token con auto-signup |
| Passwordless (SMS) | SMS OTP | Provider Twilio, rate-limited con cooldown |
| Attack Protection | Attack Protection | Regole IP, lockout brute-force, CAPTCHA, rilevamento login sospetti |
| Log Streaming | Log Streaming | Webhook, S3, Datadog, Splunk |
| User Import/Export | User Import/Export | CSV e JSON, elaborazione asincrona con tracking del progresso |
| SCIM | SCIM 2.0 Provisioning | Conforme RFC 7644, mappatura attributi, operazioni bulk |
| Custom Domains | Custom Domains | Pagine auth white-label, SSL automatico |
| Rate Limiting | Rate Limiting | 4 livelli, sliding window, header standard |
| Branding | Branding | Logo, colori, favicon, nome azienda |
Passaggi della Migrazione
Passaggio 1: Esportare gli Utenti da Auth0
Usa l’Auth0 Management API per esportare i tuoi utenti:
# Crea un job di esportazione
curl -X POST https://TUO_DOMINIO_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" }
]
}'# Controlla lo stato dell'esportazione
curl https://TUO_DOMINIO_AUTH0/api/v2/jobs/JOB_ID \
-H "Authorization: Bearer $AUTH0_MANAGEMENT_TOKEN"
# Quando lo stato è "completed", scarica il file dall'URL locationAuth0 non esporta gli hash delle password per gli utenti che si sono registrati con email/password. Questi utenti dovranno reimpostare la password dopo la migrazione, oppure puoi usare il pattern di migrazione lazy descritto di seguito.
Passaggio 2: Trasformare e Importare gli Utenti in Auris
Trasforma il formato di esportazione Auth0 nel formato di importazione 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(`Trasformati ${aurisUsers.length} utenti`)Carica su Auris:
curl -X POST https://auth.tuodominio.com/api/users/import \
-H "Authorization: Bearer $AURIS_ACCESS_TOKEN" \
-H "x-tenant: tuo-tenant-id" \
-F "[email protected]" \
-F "format=json"Passaggio 3: Creare le Applicazioni nella Console Auris
Per ogni Applicazione Auth0, crea un’Applicazione corrispondente in Auris:
- Apri Console poi Applicazioni poi Crea Applicazione
- Imposta il Tipo Applicazione in modo che corrisponda al tipo Auth0:
- Auth0 “Single Page Application” o “Regular Web Application” = Auris WEB
- Auth0 “Native” = Auris MOBILE
- Auth0 “Machine to Machine” = Auris M2M
- Configura gli URL di Callback Consentiti con gli stessi redirect URI di Auth0
- Configura le Origini Consentite con le stesse origini di Auth0
- Annota il nuovo Client ID (e il Client Secret per le app M2M)
Passaggio 4: Sostituire l’SDK Auth0 con l’SDK Auris
Installa l’SDK Auris e rimuovi l’SDK Auth0:
# Rimuovi Auth0
npm uninstall @auth0/auth0-spa-js @auth0/auth0-react @auth0/nextjs-auth0
# Installa Auris
npm install @auris/js @auris/react
# Per Next.js:
npm install @auris/nextjsPassaggio 5: Aggiornare il Codice dell’Applicazione
L’API dell’SDK Auris è intenzionalmente simile a quella di Auth0 per minimizzare lo sforzo di migrazione.
Setup Provider (React):
// PRIMA (Auth0)
import { Auth0Provider } from '@auth0/auth0-react'
function App() {
return (
<Auth0Provider
domain="tuo-tenant.auth0.com"
clientId="auth0-client-id"
authorizationParams={{
redirect_uri: window.location.origin + '/callback',
}}
>
<MyApp />
</Auth0Provider>
)
}
// DOPO (Auris)
import { AurisProvider } from '@auris/react'
function App() {
return (
<AurisProvider
domain="auth.tuazienda.com"
clientId="auris-client-id"
redirectUri={window.location.origin + '/callback'}
>
<MyApp />
</AurisProvider>
)
}Hook di Autenticazione:
// PRIMA (Auth0)
const { loginWithRedirect, logout, user, isAuthenticated, isLoading, getAccessTokenSilently } = useAuth0()
// DOPO (Auris)
const { loginWithRedirect, logout, user, isAuthenticated, isLoading, getAccessToken } = useAuris()
// Il logout è leggermente diverso:
// Auth0: logout({ logoutParams: { returnTo: window.location.origin } })
// Auris: logout({ returnTo: window.location.origin })Chiamate API con Access Token:
// PRIMA (Auth0)
const token = await getAccessTokenSilently()
// DOPO (Auris)
const token = await getAccessToken()
// Il resto del codice API rimane invariato
const response = await fetch('/api/protected', {
headers: { Authorization: `Bearer ${token}` },
})Controllo Permessi (React):
// PRIMA (Auth0 — controllo manuale del claim)
const { user } = useAuth0()
const hasPermission = user?.['https://myapp.com/permissions']?.includes('read:data')
// DOPO (Auris — hook permessi integrato)
import { useCheckPermission } from '@auris/react'
const canReadData = useCheckPermission('read:data')Middleware Next.js:
// PRIMA (Auth0)
import { withMiddlewareAuthRequired } from '@auth0/nextjs-auth0/edge'
export default withMiddlewareAuthRequired()
// DOPO (Auris)
import { aurisMiddleware } from '@auris/nextjs/middleware'
export default aurisMiddleware({
protectedPaths: ['/dashboard(.*)'],
publicPaths: ['/', '/about', '/pricing'],
loginUrl: '/auth/login',
})Passaggio 6: Aggiornare i Redirect URI
Aggiorna i Callback URL nell’applicazione Auris per corrispondere a ciò che la tua app invia:
- Sostituisci
https://tuo-tenant.auth0.com/conhttps://auth.tuazienda.com/in tutti i redirect URI
Passaggio 7: Migrare le Rules verso le Actions
Le Rules e Actions di Auth0 si mappano ai trigger dell’Actions Engine di Auris:
| Trigger Auth0 | Trigger Auris |
|---|---|
post-login | post-login |
pre-user-registration | pre-signup |
post-user-registration | post-signup |
post-change-password | post-change-password |
Esempio di Action Auth0:
// Auth0 Action (post-login)
exports.onExecutePostLogin = async (event, api) => {
if (!event.user.email_verified) {
api.access.deny('Verifica la tua email prima di accedere.')
}
api.idToken.setCustomClaim('https://myapp.com/role', event.user.app_metadata.role)
}Equivalente Auris Action:
// Auris Action (trigger post-login)
async function action(context) {
if (!context.user.emailVerified) {
return { deny: true, message: 'Verifica la tua email prima di accedere.' }
}
return {
claims: {
role: context.user.metadata?.role || 'user'
}
}
}Passaggio 8: Migrare l’RBAC
Esporta ruoli e permessi da Auth0 e ricreali in Auris:
# Elenca i ruoli Auth0
curl https://TUO_DOMINIO_AUTH0/api/v2/roles \
-H "Authorization: Bearer $AUTH0_MANAGEMENT_TOKEN"Per ogni ruolo, crealo in Auris:
curl -X POST https://auth.tuodominio.com/api/roles \
-H "Authorization: Bearer $AURIS_ACCESS_TOKEN" \
-H "x-tenant: tuo-tenant-id" \
-H "Content-Type: application/json" \
-d '{
"name": "Editor",
"description": "Può modificare i contenuti",
"color": "#3B82F6"
}'Auris supporta permessi tri-state (ALLOW/DENY) che è più granulare del modello binario di Auth0.
Passaggio 9: DNS Cutover
Una volta testato tutto:
- Configura un dominio personalizzato in Auris (es.
auth.tuazienda.com) - Aggiorna il DNS per puntare il tuo dominio di autenticazione ad Auris
- Aggiorna tutte le applicazioni per usare il nuovo dominio
- Monitora i log di audit Auris per le prime ore dopo il cutover
Gestione delle Password (Migrazione Lazy)
Poiché Auth0 non esporta gli hash delle password, hai due opzioni:
Opzione A: Forza il Reset della Password (Più Semplice)
Dopo aver importato gli utenti, attiva un’email di reset password in blocco:
- Tutti gli utenti importati ricevono un’email “Imposta la tua password”
- Gli utenti cliccano il link e impostano una nuova password su Auris
- Non sono richieste modifiche al codice dell’applicazione
Opzione B: Migrazione Lazy (Zero Friction)
Esegui Auth0 e Auris in parallelo temporaneamente. Quando un utente effettua il login:
- Auris tenta di autenticare l’utente
- Se l’utente non ha password in Auris (importato senza), Auris restituisce un errore specifico
- La tua applicazione intercetta questo errore e tenta l’autenticazione su Auth0 come fallback
- Se Auth0 ha successo, la tua applicazione crea la password in Auris tramite l’Admin API
- I login successivi vanno direttamente tramite Auris
Questo approccio migra le password in modo trasparente man mano che gli utenti effettuano il login, con zero friction.
Il pattern di migrazione lazy richiede di mantenere attivo il tenant Auth0 durante il periodo di migrazione. Pianifica la sua disattivazione dopo un periodo ragionevole (es. 30-90 giorni) quando la maggior parte degli utenti attivi ha migrato.
Piano di Rollback
In caso di problemi durante la migrazione:
- Mantieni Auth0 attivo per almeno 30 giorni dopo il cutover
- Rollback DNS: Reindirizza il tuo dominio di autenticazione ad Auth0
- Rollback SDK: Ripristina i pacchetti
@auris/*con@auth0/*nel codice e rideploya - Nessuna perdita di dati: Gli utenti creati in Auris durante la migrazione possono essere esportati e reimportati in Auth0
Checklist Post-Migrazione
Dopo aver completato la migrazione, verifica:
- Tutti gli utenti riescono ad accedere (testa con più account)
- I provider di login social funzionano (Google, GitHub, ecc.)
- L’iscrizione e la verifica MFA funzionano
- Il controllo degli accessi basato sui ruoli è applicato correttamente
- I webhook consegnano eventi ai tuoi endpoint
- Il log streaming è attivo (se configurato)
- I domini personalizzati e SSL funzionano
- Le app mobile (se presenti) sono aggiornate con il nuovo SDK
- Le applicazioni M2M riescono a ottenere token
- Il provisioning SCIM è connesso (se usato)
Guide Correlate
- Login Ospitato (PKCE) — Implementare il flusso di login
- Ruoli e Permessi — Configurare l’RBAC
- Autorizzazione Fine-Grained — Migrare da Auth0 FGA
- Import/Export Utenti — Migrazione utenti in blocco
- Domini Personalizzati — White-label delle pagine di autenticazione
- Migrazione da Firebase — Guida di migrazione alternativa