New hosts: management pages are now at manage.heyidentity.dev and the Agent API at api.heyidentity.dev. Sign-in URLs for your apps are unchanged. What to change

Fake OpenID Connect & OAuth 2.0 provider

Test your app's sign-in without a real identity provider.

HeyIdentity is a hosted identity provider made for development, CI and demos. Your app talks real OpenID Connect to it, but signing in means picking a test user you configured. There are no passwords and no tenant to provision. Give each user the roles and claims you need, and test Entra ID apps without an Entra tenant.

Sign up Try the live demo

For development and testing only. HeyIdentity is not meant to protect production identities.

Use cases

Demos

Show your app's signed-in experience without sharing real accounts. Presenters pick "Avery Admin" or "Riley User" from a list, and no password ends up on a slide.

Local development

Point your app at a real OIDC discovery URL and switch between users with different roles in seconds while you build authorization logic.

Automated tests and CI

End-to-end tests get real signed tokens from a predictable set of users. Change a user's roles to test access control without touching a production directory.

Features

Users, roles and claims

Each configuration has its own test users. Give them roles, email or any custom claim, as strings, arrays or objects, and choose which token each claim goes into.

Standards OIDC flows

Discovery, Authorization Code with PKCE, client credentials, refresh tokens, userinfo, JWKS with key rotation, and sign-out through end_session_endpoint.

Token shape to match your IdP

The Generic profile lets you choose scope or scp, string or array scopes, where roles live (for example Keycloak's realm_access.roles), and aud or client_id.

Entra ID drop-in

The Microsoft profile serves Entra ID v2.0 URLs and claims (tid, oid, ver, scp, client_info). Microsoft.Identity.Web and MSAL.NET work after you point Instance and TenantId at HeyIdentity; token acquisition needs one extra setting, covered in the guide.

Self-service tenants

Sign up with your email to get your own tenant, a starter configuration and a management link for editing users, clients and settings. No admin approval is needed.

Real signed tokens

Tokens are signed with per-configuration keys published at the JWKS endpoint, so your app validates them exactly as it would in production.

How it works

  1. Sign up with your email. You get a tenant and a management link.
  2. Configure your test users (roles, claims) and your app's client (redirect URIs, scopes) through the management link.
  3. Point your app at your configuration's discovery URL. Signing in shows your test users; pick one and your app gets signed tokens.

Integration

Every configuration has its own issuer. Use the discovery URL with any standards-compliant OIDC library.

# Discovery (Generic and Microsoft profiles)
https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}/.well-known/openid-configuration

# Entra ID authority (Microsoft profile): Instance = https://app.heyidentity.dev/, TenantId = {configurationId}
https://app.heyidentity.dev/{configurationId}/v2.0

ASP.NET Core

builder.Services.AddAuthentication(options =>
{
    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie()
.AddOpenIdConnect(options =>
{
    options.Authority = "https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}";
    options.ClientId = "my-app";
    options.ClientSecret = "my-app-secret";
    options.ResponseType = "code";
    options.Scope.Add("email");
    options.MapInboundClaims = false;                     // keep "roles" and "name" as issued
    options.TokenValidationParameters.NameClaimType = "name";
    options.TokenValidationParameters.RoleClaimType = "roles";
});

Browser SPA (oidc-client-ts)

import { UserManager } from 'oidc-client-ts';

const userManager = new UserManager({
  authority: 'https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}',
  client_id: 'my-spa',                      // public client: PKCE, no secret
  redirect_uri: `${location.origin}/callback`,
  scope: 'openid profile email',
});
await userManager.signinRedirect();

Node.js (openid-client)

import * as client from 'openid-client';

const config = await client.discovery(
  new URL('https://app.heyidentity.dev/t/{tenantRouteId}/c/{configurationId}'),
  'my-app',
  'my-app-secret',
);
const verifier = client.randomPKCECodeVerifier();
const url = client.buildAuthorizationUrl(config, {
  redirect_uri: 'http://localhost:3000/callback',
  scope: 'openid profile email',
  code_challenge: await client.calculatePKCECodeChallenge(verifier),
  code_challenge_method: 'S256',
});

Your tenant route ID and configuration ID are shown on your management page after signup. The live demo uses public demo configurations you can try right away.

Step-by-step: Entra ID apps without a tenant, Playwright and CI tests, role-based authorization.

Guides

Pricing

HeyIdentity is in beta. Free covers test suites that reuse signed-in state. Pro raises the limits, so a suite can sign in once per test class, and adds session pinning. Early adopters get it free. Enterprise raises a tenant's total for suites on several runners, granted on request.

Free

EUR 0

  • 5 configurations per tenant
  • 5 clients and 20 users per configuration
  • 120 per minute sign-in and token requests per tenant
  • Session pinning: not included

These limits apply once the owner's email is verified, and existing tenants keep at least these per-tenant limits. A configuration with one user never shows a picker, on every plan.

Until the owner's email is verified, lower limits apply and the tenant expires: an agent-created tenant after 7 days, an unconfirmed sign-up after 30 days. Full limits

Pro Early-adopter offer

EUR 12 per month once billing launches

  • 20 configurations per tenant
  • 20 clients and 100 users per configuration
  • 300 per minute sustained sign-in and token requests per tenant, bursts up to 600
  • Session pinning: sign-ins skip the user picker

Activate before 31 January 2027 and Pro is free until 31 January 2028. You activate it on your management page after your email is confirmed. No payment details are needed.

Sign up and activate Pro

Already have a tenant? Activate Pro on your management page. Lost the link? Recover it.

Session pinning (Pro)

Pin a test user in your browser and sign-ins skip the user picker.

  1. On the user picker, choose Pin and sign in for the user you want.
  2. Your app shows Signed in as that user.
  3. Sign out and sign in again: the picker is skipped.
  4. Open the pinned user page and choose Clear pin to bring the picker back.

Ready to test your sign-in?

Create a tenant in a minute. You get a starter configuration with a demo client and a test user.

Sign up Try the live demo