Migration

Migrate from Auth0

Stop paying per-MAU. AuthMe gives you the same features — OAuth 2.0, social login, MFA, organizations — without the cloud bill.

Why migrate from Auth0?

$0/mo
No per-MAU charges
Auth0 charges $23/1000 MAU on paid plans
Unlimited
Users, no paywall
Auth0 free tier limited to 7,500 MAU
Full data
ownership
Your servers, your data, your rules
No vendor
lock-in risk
Open source, self-hosted, forkable

Feature Mapping

Auth0 AuthMe Notes
Tenant Realm Same isolation concept
Application (SPA) Client (public) PKCE enforced
Application (Regular Web) Client (confidential) With client secret
Application (M2M) Client (service account) Client Credentials grant
Roles Roles Realm and client-level roles
Organizations Organizations B2B multi-tenancy
Social Connections Identity Providers OIDC/SAML brokering
Enterprise (SAML) Identity Providers (SAML) Full SP mode
Database Connections Local Users Default user store
Rules / Actions Plugins / Webhooks Event-driven extensions
Branding Realm Theming Custom login pages
Logs Events / Audit Logs Login + admin events

Step-by-Step Migration

1

Export Auth0 Users

Use the Auth0 Management API to export your users with their metadata and roles.

# Export users via Auth0 Management API
curl -X POST "https://YOUR_DOMAIN.auth0.com/api/v2/jobs/users-exports" \
  -H "Authorization: Bearer ${MGMT_TOKEN}" \
  -H "Content-Type: application/json" \
  -d '{
    "format": "json",
    "fields": [
      {"name": "user_id"},
      {"name": "email"},
      {"name": "name"},
      {"name": "user_metadata"},
      {"name": "app_metadata"}
    ]
  }'
2

Deploy AuthMe

Start AuthMe and create your realm.

# Start AuthMe
docker compose up -d

# Create a realm matching your Auth0 tenant
curl -X POST "http://localhost:3000/admin/realms" \
  -H "x-admin-api-key: ${ADMIN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "my-app",
    "displayName": "My Application"
  }'
3

Create OAuth Clients

Recreate your Auth0 Applications as AuthMe clients. Match client IDs where possible.

# Create a client for your SPA
curl -X POST "http://localhost:3000/admin/realms/my-app/clients" \
  -H "x-admin-api-key: ${ADMIN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "my-spa",
    "name": "My SPA",
    "type": "public",
    "redirectUris": ["http://localhost:3000/callback"],
    "webOrigins": ["http://localhost:3000"]
  }'

# Create a client for your API
curl -X POST "http://localhost:3000/admin/realms/my-app/clients" \
  -H "x-admin-api-key: ${ADMIN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "clientId": "my-api",
    "name": "My API",
    "type": "confidential"
  }'
4

Import Users

Import your exported Auth0 users into AuthMe. Since Auth0 uses BCrypt, users will need to set new passwords (or use social login).

# Import users to AuthMe
# Note: Auth0 BCrypt hashes cannot be directly imported.
# Users will receive a password reset email on first login.
curl -X POST "http://localhost:3000/admin/realms/my-app/users" \
  -H "x-admin-api-key: ${ADMIN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "user@example.com",
    "firstName": "John",
    "lastName": "Doe",
    "emailVerified": true,
    "requirePasswordReset": true
  }'
5

Migrate Social Connections

Recreate your Auth0 Social Connections as AuthMe Identity Providers.

# Add Google as an Identity Provider
curl -X POST "http://localhost:3000/admin/realms/my-app/identity-providers" \
  -H "x-admin-api-key: ${ADMIN_API_KEY}" \
  -H "Content-Type: application/json" \
  -d '{
    "alias": "google",
    "displayName": "Google",
    "providerId": "oidc",
    "enabled": true,
    "config": {
      "clientId": "your-google-client-id",
      "clientSecret": "your-google-client-secret",
      "issuer": "https://accounts.google.com",
      "authorizationUrl": "https://accounts.google.com/o/oauth2/v2/auth",
      "tokenUrl": "https://oauth2.googleapis.com/token"
    }
  }'
6

Swap the SDK

Replace the Auth0 SDK with the AuthMe SDK in your application. The API is similar.

// Before: Auth0 SDK
import { Auth0Client } from '@auth0/auth0-spa-js';
const auth0 = new Auth0Client({
  domain: 'your-tenant.auth0.com',
  clientId: 'my-spa',
  redirectUri: window.location.origin,
});

// After: AuthMe SDK
import { AuthmeClient } from 'authme-sdk';
const authme = new AuthmeClient({
  url: 'https://auth.example.com',
  realm: 'my-app',
  clientId: 'my-spa',
  redirectUri: window.location.origin + '/callback',
});

// Same methods work!
await authme.login();
const user = authme.getUserInfo();
await authme.logout();

Important Notes

  • Password hashes: Auth0 uses BCrypt which cannot be directly imported. Users will need to reset passwords or use social login.
  • Social logins: Users who authenticated via Google/GitHub can log in immediately if you configure the same OAuth app credentials.
  • Rules/Actions: Convert Auth0 Rules to AuthMe Plugins or Webhooks — both support custom logic on auth events.
  • Custom domains: Update your DNS to point your auth domain to your AuthMe instance.
  • Testing: Run AuthMe in parallel with Auth0 during migration. Test all flows before full cutover.