delivered for clients · names withheldimplementation Identity and access

Homegrown customer login to Auth0 or Okta Customer Identity

Cohash replaces homegrown customer login with Auth0, Okta's customer identity platform. We read the current user store and how passwords are hashed, then set up development, staging and production tenants with Universal Login. Users move by bulk import or by automatic migration when they next sign in. Passkeys and MFA go in, and post-login Actions keep Salesforce or Dynamics 365 contact records current.

  1. 01Read the current user store
  2. 02Tenants and Universal Login
  3. 03Move users
  4. 04Connect apps and CRM
  5. 05Cut over and retire the table
case-study / homegrown-login-to-ciam delivered
beforeHomegrown customer login and user table afterAuth0 customer identity
01 · CUSTOMERS 02 · APPLICATIONS 03 · AUTH0 04 · CRM AND ENTERPRISE IDPS Customers: passkeys · MFA Customers passkeys · MFA Business customers: their own Okta or Entra ID Business customers their own Okta orEntra ID Web app: OIDC with PKCE Web app OIDC with PKCE Mobile app: OIDC with PKCE Mobile app OIDC with PKCE Auth0 Universal Login: custom domain · attack protection Auth0 UniversalLogin custom domain · attackprotection Post-login Actions: CRM sync · enrichment Post-login Actions CRM sync · enrichment Custom database connection: automatic migration Custom databaseconnection automatic migration Salesforce or Dynamics 365: contacts Salesforce orDynamics 365 contacts Customer identity providers: via Organizations Customer identityproviders via Organizations
01 · CUSTOMERS02 · APPLICATIONS03 · AUTH004 · CRM AND ENTERPRISE IDPS Customers: passkeys · MFA Customers passkeys · MFA Business customers: their own Okta or Entra ID Businesscustomers their own Okta orEntra ID Web app: OIDC with PKCE Web app OIDC with PKCE Mobile app: OIDC with PKCE Mobile app OIDC with PKCE Auth0 Universal Login: custom domain · attack protection Auth0UniversalLogin custom domain ·attackprotection Post-login Actions: CRM sync · enrichment Post-loginActions CRM sync ·enrichment Custom database connection: automatic migration Customdatabaseconnection automaticmigration Salesforce or Dynamics 365: contacts Salesforce orDynamics 365 contacts Customer identity providers: via Organizations Customeridentityproviders via Organizations © Cohash · cohash.com
case file

The story

Told without the client's name or anything that could identify them.

what happened

A subscription business's digital team ran customer sign-in on homegrown code, with passwords in an application table hashed by a scheme chosen years earlier. Reset, MFA and lockout were custom code that rarely got tested, and bot sign-ups and credential stuffing showed up in the logs every week. We started by reading the user store: hash format, duplicate emails, unverified accounts and every app that read the table. Users then moved to Auth0 through bulk import or automatic migration on next sign-in, the apps switched to Universal Login over OIDC, and the old password columns were dropped once migration traffic fell away.

why it was urgent

In July 2025 NIST published SP 800-63B-4, now the federal baseline for authenticators and password rules. On 21 May 2026 Auth0 made Auth for MCP generally available, which lets your customers' AI agents call your APIs with proper OAuth. Getting a homegrown login table to support either one is real engineering work.

problem statement
  • openYour customers' passwords still live in an app table, hashed however somebody decided to hash them years ago.
  • recurringPassword reset, MFA and account lockout are custom code that rarely gets tested.
  • blockedBot sign-ups and credential stuffing show up in the logs every week.
  • openBusiness customers ask to sign in with their own Okta or Entra ID.
architecture

The estate, before and after

before
before

Before: homegrown sign-in in front of an application user table

Web and mobile apps posted credentials to custom login code that checked an old hashing scheme in the app's own table. Reset, MFA and lockout were custom code, and bots hit the same form as customers.

Before: homegrown sign-in in front of an application user table Web and mobile apps posted credentials to custom login code that checked an old hashing scheme in the app's own table. Reset, MFA and lockout were custom code, and bots hit the same form as customers. 01 · CUSTOMERS 02 · APPLICATIONS 03 · HOMEGROWN IDENTITY 04 · CRM password sign-in password sign-in stuffing attempts form post legacy endpoint hash check contact data Customers web · mobile Bots and credentialstuffing Web app custom login form Mobile app old login endpoint Homegrown login code reset · MFA · lockout User table old hash scheme ·duplicate emails Sf Salesforce orDynamics 365 contact records © Cohash · cohash.com
01 · CUSTOMERS02 · APPLICATIONS03 · HOMEGROWN IDENTITY04 · CRM Customers: web · mobile Customers web · mobile Bots and credential stuffing Bots andcredentialstuffing Web app: custom login form Web app custom login form Mobile app: old login endpoint Mobile app old login endpoint Homegrown login code: reset · MFA · lockout Homegrown logincode reset · MFA ·lockout User table: old hash scheme · duplicate emails User table old hash scheme ·duplicate emails Salesforce or Dynamics 365: contact records Salesforce or Dynamics 365 contact records password sign-in password sign-in stuffing attempts form post legacy endpoint contact data © Cohash · cohash.com
after
after

After: Auth0 Universal Login handles every customer sign-in

Apps hand sign-in to Auth0 over OIDC with PKCE. Users who haven't moved yet migrate on next login through a custom database connection. Post-login Actions keep CRM contacts current, and business customers federate their own identity provider.

After: Auth0 Universal Login handles every customer sign-in Apps hand sign-in to Auth0 over OIDC with PKCE. Users who haven't moved yet migrate on next login through a custom database connection. Post-login Actions keep CRM contacts current, and business customers federate their own identity provider. 01 · CUSTOMERS 02 · APPLICATIONS 03 · AUTH0 04 · CRM AND ENTERPRISE IDPS sign in sign in sign in OIDC + PKCE OIDC + PKCE migrate on login post-login update contact federate Customers passkeys · MFA Business customers their own Okta or Entra ID Web app OIDC with PKCE Mobile app OIDC with PKCE Auth0 UniversalLogin custom domain ·attack protection Post-login Actions CRM sync · enrichment Custom databaseconnection automatic migration Sf Salesforce orDynamics 365 contacts Customer identityproviders via Organizations © Cohash · cohash.com
01 · CUSTOMERS02 · APPLICATIONS03 · AUTH004 · CRM AND ENTERPRISE IDPS Customers: passkeys · MFA Customers passkeys · MFA Business customers: their own Okta or Entra ID Businesscustomers their own Okta orEntra ID Web app: OIDC with PKCE Web app OIDC with PKCE Mobile app: OIDC with PKCE Mobile app OIDC with PKCE Auth0 Universal Login: custom domain · attack protection Auth0UniversalLogin custom domain ·attackprotection Post-login Actions: CRM sync · enrichment Post-loginActions CRM sync ·enrichment Custom database connection: automatic migration Customdatabaseconnection automaticmigration Salesforce or Dynamics 365: contacts Salesforce orDynamics 365 contacts Customer identity providers: via Organizations Customeridentityproviders via Organizations sign in sign in sign in OIDC + PKCE OIDC + PKCE update contact federate © Cohash · cohash.com
results

What the client got

What changed for the client once the work was done. Described, not scored: we don't publish client figures.

  1. result 01

    Customers kept their passwords through the move

    We bulk imported every user with a supported hash and migrated the rest when they next signed in, through a custom database connection. Nobody got a forced reset email.

  2. result 02

    Sign-in runs on Universal Login with passkeys and MFA

    Passkeys, MFA and attack protection used to be custom code. Now they're tenant settings, and they apply to web and mobile alike.

  3. result 03

    CRM contacts stay current from sign-in

    Each sign-in now runs a post-login Action that updates the customer's Salesforce or Dynamics 365 contact record.

  4. result 04

    Business customers bring their own identity provider

    We set up Organizations so business customers sign in with their own Okta or Entra ID and skip a separate password.

  5. result 05

    Tenant configuration lives in source control

    We export the development, staging and production tenants with the Deploy CLI, so a change gets reviewed and promoted the same way code does.

what can go wrong

Risks we plan for

  1. Duplicate accounts by email

    It's common to find the same email in a homegrown store twice, with two different passwords. We settle account linking rules before the import, otherwise those users get two profiles.

  2. Monthly active user costs

    What you pay for Auth0 depends on active users and features. Test accounts, bots and dormant users inflate the count, so we find them before you pick a plan.

  3. Mobile apps on old versions

    Users who never update the app keep calling the old login endpoint. It stays up, or forces an upgrade, until usage falls.

  4. Session cut-over

    Sessions don't carry over to Auth0. So we pick when to switch and let users know ahead of time, to avoid logging anyone out in the middle of a checkout.

ai in this move

Where AI helps, and where it needs guardrails

Auth0 for AI Agents adds Token Vault and asynchronous authorization for approvals. It also adds fine-grained authorization, so retrieval only returns what a user may see. And Auth for MCP lets your own MCP servers accept OAuth tokens. If customers or their agents will reach your services through MCP, put the scopes and consent screens into this build. API keys added later are what we're trying to avoid.

forward deployed engineers →
you keep

What you're left with

We write these for your setup, and they're working documents. Your team should be able to keep things running from them long after we've gone.

  • report01

    User store analysis covering hashes, duplicates and dependent apps

    yours to keep
  • evidence02

    Tenant configuration in source control for three environments

    yours to keep
  • tests03

    User migration plan with bulk import and automatic migration tested

    yours to keep
  • document04

    Post-login Actions for CRM sync and enrichment

    yours to keep
  • runbook05

    Cut-over runbook and attack protection settings

    yours to keep
field notes

Learn the background

Terms from this page in plain English. If you want the why, the field note behind it is right there.

01custom database connection
An Auth0 connection that hands login checks to scripts you write, and those scripts talk to a database you already run. It's what keeps the old user table working while you move.in context →
02Rules
The JavaScript snippets Auth0 used to run at login. Someone would write one to add a role to the token or block a sign-in, and each one ran after the last.in context →
03Actions
The replacement for both. Each one is a small JavaScript function you attach to a trigger such as post-login. It carries its own secrets, and other Actions can't read them.in context →
04tenant logs
Auth0's running record of logins, errors and other events in your account. How far back you can look depends on your plan, and it can be as little as a day.in context →
05tenant
Your company's Microsoft account. Every environment draws on one shared pool of storage, so a bloated test copy hits everyone.in context →
06passkey
A sign-in key that lives on your phone or computer, or on a security key you carry. You never type a code, so a fake login page has nothing to steal.in context →
Coderead-only Old: 18 Nov2026 Hooks stop Rules stop Nov 2024 Jan 2028
field note · 14 min · 3-question check Auth0 moved the Rules and Hooks deadline: Hooks stop on 30 April 2027, Rules on 31 January 2028 the ideaTwo dates now, not one. Hooks go first, Rules nine months later. read the note
talent and delivery · auth0 customer identity

Certified engineers, wherever you need them.

Some clients want a project team, some want a couple of engineers on theirs. Either works. Onsite, nearshore or offshore, with handovers across time zones that keep things moving.

Onsite

Engineers at your sites in the US

Nearshore

Overlapping hours with US teams

Offshore

Overnight progress on your backlog

All time zones

Coverage handed over across time zones

24-hour coverage · US Central time
OnsiteUS business hours
Nearshoreoverlapping US hours
Offshoreovernight progress
Combinedhandover, not hand-off
01Will customers have to reset their passwords?

Not if we can import the hashes or use automatic migration. With automatic migration the user signs in once with their old password, Auth0 checks it against your database, and stores it from then on.

02Auth0 or Okta Workforce Identity for customers?

They're different products. Auth0 is Okta's customer identity platform, with Universal Login, Organizations for business customers and MAU-based pricing. Workforce Identity is built for employees. Customer sign-in, we put on Auth0.

03What drives the cost?

Monthly active users, which features you need, how many apps connect, and how messy the existing user data is. We count active users from your logs before you choose a plan.

04Can you also handle our B2B customers?

Yes, that's what Organizations is for. Each business customer connects its own Okta, Entra ID or SAML identity provider and manages its own users.

fact-checked Checked against vendor and official documentation last checked 2026-10-20 content fingerprint 6bc242d3
  1. 01Book a 30-minute working sessionsenior engineer
  2. 02Talk to an engineer about your setupreply within 24 hours
  3. 03See how similar projects wentcase studies
Reviewed by the Cohash team Product names are trademarks of their owners. how we handle facts and data →
next step

Planning this move?

A 30-minute working session with a senior engineer. No slides.

useful to bring
  • The platform and the version you're on
  • Where you need to get to, and by when
  • What's custom: rules, plugins, integrations
  • Any audit finding or deadline driving it