10 KiB
10 KiB
description
| description |
|---|
| Migration guide for moving from other auth providers to Auth0 |
OAuth Migration Guide
Migrate from other authentication providers to Auth0.
Quick Start
/oauth-migrate [provider]
Supported providers:
firebase- Firebase Authenticationokta- Oktacognito- AWS Cognitokeycloak- Keycloakcustom- Custom JWT/OAuth implementationsocial-only- Only social logins (no user DB)
Migration: Firebase → Auth0
Phase 1: Planning (1-2 hours)
Assess current setup:
- How many users? (1k, 100k, 1M+)
- Authentication methods? (email/password, social, custom)
- Custom claims? (roles, metadata)
- Token usage? (access tokens, ID tokens)
Timeline:
- Small (1k users): 1 day
- Medium (10k users): 3-5 days
- Large (100k+ users): 1-2 weeks
Parallel running (recommended):
- Keep Firebase running while testing Auth0
- Gradual migration: 10% → 25% → 50% → 100%
- Rollback plan: If Auth0 issues, fall back to Firebase
Phase 2: Set Up Auth0 (1-2 hours)
# Step 1: Create Auth0 account
# https://auth0.com/signup
# Step 2: Create application
/oauth-setup-auth0
# Step 3: Configure connections
# - Enable database connection
# - Enable same social connections as Firebase
# - Copy social app credentials from Firebase
Phase 3: User Migration (1-3 days)
Option A: Automatic Migration (Recommended)
Use Auth0 extensibility to migrate users on first login:
// Auth0 Rule: Migrate users from Firebase
module.exports = function(user, context, callback) {
// Check if user already in Auth0
if (user.identities && user.identities.length > 0) {
return callback(null, user, context)
}
// Try to authenticate against Firebase
const firebase = require('firebase')
firebase.initializeApp({
apiKey: process.env.FIREBASE_API_KEY,
authDomain: process.env.FIREBASE_AUTH_DOMAIN,
databaseURL: process.env.FIREBASE_DATABASE_URL
})
firebase.auth().signInWithEmailAndPassword(user.email, context.request.query.password)
.then(function(firebaseUser) {
// Get Firebase custom claims
firebaseUser.getIdTokenResult()
.then(function(idTokenResult) {
// Copy Firebase claims to Auth0
user.app_metadata = user.app_metadata || {}
user.app_metadata.firebase_id = firebaseUser.uid
user.app_metadata.roles = idTokenResult.claims.roles || []
// Create Auth0 user
context.clientMetadata = {
firebase_migrated: 'true'
}
callback(null, user, context)
})
})
.catch(function(error) {
callback(new Error('Firebase auth failed: ' + error.message))
})
}
Benefits:
- ✅ No downtime
- ✅ Users migrate automatically on first login
- ✅ Can run parallel with Firebase
- ✅ Easy rollback
Timeline: 2-3 weeks (let users naturally migrate)
Option B: Bulk Migration
Export Firebase users and import to Auth0:
# Step 1: Export users from Firebase
firebase auth:export users.json --format json
# Step 2: Transform to Auth0 format
node transform-firebase-to-auth0.js
# Step 3: Import to Auth0
# Auth0 Dashboard → Users → Import (drag CSV)
# Or use Management API
transform-firebase-to-auth0.js:
const fs = require('fs')
const firebaseUsers = JSON.parse(fs.readFileSync('users.json', 'utf8'))
const auth0Users = firebaseUsers.users.map(user => ({
email: user.email,
email_verified: user.emailVerified,
user_id: user.localId,
identities: [{
connection: 'Username-Password-Authentication',
user_id: user.localId,
provider: 'auth0',
isSocial: false
}],
user_metadata: user.customClaims || {},
app_metadata: {
roles: user.customClaims?.roles || [],
firebase_id: user.localId
},
blocked: !user.emailVerified,
created_at: new Date(parseInt(user.createdAt)).toISOString(),
updated_at: new Date(parseInt(user.lastLoginAt)).toISOString()
}))
fs.writeFileSync('auth0-users.json', JSON.stringify(auth0Users, null, 2))
console.log(`Converted ${auth0Users.length} users`)
Timeline: 1-2 hours (bulk import) + verification
Phase 4: Update Application Code (2-4 hours)
Frontend Migration (React)
// BEFORE (Firebase)
import { initializeApp } from 'firebase/app'
import { getAuth, signInWithEmailAndPassword } from 'firebase/auth'
const app = initializeApp(firebaseConfig)
const auth = getAuth(app)
async function login(email, password) {
const userCredential = await signInWithEmailAndPassword(auth, email, password)
const token = await userCredential.user.getIdToken()
return token
}
// AFTER (Auth0)
import { useAuth0 } from '@auth0/auth0-react'
function LoginPage() {
const { loginWithRedirect } = useAuth0()
return (
<button onClick={() => loginWithRedirect()}>
Login with Auth0
</button>
)
}
export default function App() {
const { getAccessTokenSilently } = useAuth0()
async function getToken() {
return await getAccessTokenSilently()
}
}
Backend Migration (Node.js)
// BEFORE (Firebase)
import * as admin from 'firebase-admin'
const app = admin.initializeApp()
function verifyToken(token) {
return admin.auth().verifyIdToken(token)
}
// AFTER (Auth0)
import { expressjwt } from 'express-jwt'
import jwksRsa from 'jwks-rsa'
const checkJwt = expressjwt({
secret: jwksRsa.expressJwtSecret({
jwksUri: `https://${process.env.AUTH0_DOMAIN}/.well-known/jwks.json`
}),
audience: `https://${process.env.AUTH0_DOMAIN}/api/v2/`,
issuer: `https://${process.env.AUTH0_DOMAIN}/`,
algorithms: ['RS256']
})
app.get('/api/protected', checkJwt, (req, res) => {
res.json({ user: req.auth.sub })
})
Phase 5: Testing (1-2 days)
// Test list
- [ ] User login (email/password)
- [ ] User signup
- [ ] Social login (Google, GitHub, etc)
- [ ] Password reset
- [ ] Token refresh
- [ ] API access with token
- [ ] MFA (if enabled)
- [ ] Logout clears session
- [ ] Session persistence
- [ ] Error handling (invalid password, etc)
Test script:
# Test login flow
curl -X POST https://YOUR_DOMAIN/oauth/token \
-H "Content-Type: application/json" \
-d '{
"client_id": "YOUR_CLIENT_ID",
"client_secret": "YOUR_CLIENT_SECRET",
"audience": "https://YOUR_DOMAIN/api/v2/",
"grant_type": "client_credentials"
}'
# Test protected API
curl -H "Authorization: Bearer ACCESS_TOKEN" \
http://localhost:3001/api/protected
Phase 6: Deployment (2-4 hours)
Deployment checklist:
- Update environment variables
- Deploy frontend to staging
- Deploy backend to staging
- Run full test suite
- Smoke test in production-like environment
- Deploy to production
- Monitor Auth0 logs for errors
- Monitor application errors
- Have rollback plan ready
Gradual rollout:
- Deploy to 10% of users
- Monitor for 2-4 hours
- If OK, deploy to 50%
- Monitor for 2-4 hours
- Deploy to 100%
Migration: Cognito → Auth0
Key Differences
| Feature | Cognito | Auth0 |
|---|---|---|
| Setup | AWS Dashboard (complex) | Auth0 Dashboard (simple) |
| Scopes | Fixed scopes | Custom scopes |
| Rules | Limited | Powerful (JavaScript) |
| User management | Via AWS API | Via UI or API |
| Custom claims | userAttributes | app_metadata, user_metadata |
| MFA | Built-in | Multiple options |
| Cost | Pay per user | Fixed tier |
Migration Steps
-
Export Cognito users:
aws cognito-idp list-users --user-pool-id us-east-1_xxx > cognito-users.json -
Transform to Auth0 format:
// Similar to Firebase migration // Map Cognito attributes to Auth0 metadata -
Update token validation:
// Change from Cognito to Auth0 jwks URI jwksUri: `https://${AUTH0_DOMAIN}/.well-known/jwks.json` -
Update frontend SDK:
// Replace Amplify with Auth0 SDK import { useAuth0 } from '@auth0/auth0-react'
Rollback Plan
If issues occur:
- Immediately revert to previous provider
- Keep both systems running during migration
- Have database backup before migration
- Monitor error rates during rollout
# Revert frontend
git revert <commit> # Go back to old SDK
npm install # Reinstall old packages
npm run deploy # Deploy rollback
# Check status
Auth0 Dashboard → Logs (verify no new logins via Auth0)
Firebase Console → Logs (verify resumed usage)
Post-Migration
Cleanup
- Decommission old auth system
- Delete old user data (after retention period)
- Update documentation
- Train team on new system
- Close old auth provider account
Optimization
- Review Auth0 rules for performance
- Optimize token expiration
- Set up audit logging
- Monitor costs
- Plan security hardening
Common Migration Issues
| Issue | Solution |
|---|---|
| User exists error on import | Deduplicate by email before import |
| Scopes missing | Manually add to Auth0 API config |
| Custom claims lost | Map to user_metadata in Auth0 |
| Password reset broken | Reconfigure email templates in Auth0 |
| Social login not working | Re-add social app credentials |
Timeline Summary
| Provider | Automatic | Bulk | Total |
|---|---|---|---|
| Firebase (1k users) | 2-3 weeks | 3-5 days | 1 week |
| Firebase (100k users) | 3-4 weeks | 2-3 weeks | 4-5 weeks |
| Cognito (any size) | 2-3 weeks | Similar to Firebase | 3-5 weeks |
| Custom OAuth (simple) | 1 week | 2-3 days | 1 week |
| Custom OAuth (complex) | 2-3 weeks | 1-2 weeks | 3-4 weeks |
Next Steps
- Choose migration strategy (automatic vs bulk)
- Set up Auth0 tenant (
/oauth-setup-auth0) - Test integration (
/oauth-implement [framework]) - Run security audit (
/oauth-security-audit) - Execute migration (follow phase-by-phase plan)
- Monitor closely during first week
Status: Migration guide ready!
Need help? /oauth-troubleshoot or contact Auth0 support