User impersonation tools come in three kinds: features built into your authentication provider, open-source libraries for your web framework, and support-access products that add requests, approvals and limits around a session your app creates. No single impersonation tool is best for every team. The right one fits the auth stack you already run and covers the access policy you actually have.
So start from your stack, not a feature list. If you use Clerk, WorkOS, Keycloak or an Auth0 plan with Session Delegation, you already have some user impersonation software. If your app manages its own sessions in Django, Laravel, Symfony or Rails, a library is the usual starting point. Then look at what’s missing.
This guide covers what each category gives you and what to compare. If you’re ready to decide between configuring, building or buying, read build vs buy for user impersonation next.
What kinds of user impersonation tools are there?
A user impersonation tool lets an authorized staff member use your application as a specific customer user, without the customer’s password. The categories differ mainly in where the “who may do this” decision lives.
- Auth-provider features create the impersonated session inside the provider. The provider records the actor. Your app decides what an impersonated session may do.
- Framework libraries swap the logged-in user in your app’s own session. You write the permission check and everything around it.
- Support-access products run requests, approvals and session controls. Your app still creates and revokes the session and enforces restrictions on its backend.
The lines blur. Some providers ship a fair amount of workflow, and a product can sit on top of a provider feature.
What do auth providers include?
Native features vary more than most teams expect. Here’s what each provider documents:
- Clerk offers impersonation from its Dashboard (opens in a new tab) and actor tokens through its Backend API. The impersonator appears in an
actclaim on the session token. Impersonated sessions time out after 10 minutes of inactivity and can’t outlive a maximum set on the actor token, 30 minutes by default. The docs mention a free allowance of 5 impersonations a month. - Auth0 Session Delegation (opens in a new tab) lets an authorized actor, such as a support agent, establish a web session as another user. A Custom Token Exchange Action you write authorizes each delegation. It’s listed for B2C Professional, B2B Professional and Enterprise plans. Delegated sessions have a fixed two-hour lifetime (opens in a new tab), and tenant logs record the actor.
- Better Auth’s admin plugin (opens in a new tab) has an
impersonatepermission and a separateimpersonate-adminspermission. Sessions last one hour by default, andstopImpersonatingreturns to the admin account. - WorkOS AuthKit offers Dashboard impersonation (opens in a new tab) once an Admin enables it. It requires a reason, adds an
actclaim and ends sessions after 60 minutes. - PropelAuth goes furthest toward a full workflow, according to its secure user impersonation post (opens in a new tab): per-employee permission, an impersonation audit log, Email or Slack alerts, active-session revocation, request-and-approve access, an organization blocklist and per-employee organization allowlists.
- Keycloak lets any user with the realm’s impersonation role (opens in a new tab) impersonate users. Fine-grained admin permissions (opens in a new tab) can limit impersonation to members of specific groups, or block it for specific users.
None of these decide what an impersonated session may do in your app. That stays with your backend, which reads the actor claim and applies restrictions.
What do framework libraries give you?
Libraries are the lightest option. They’re open source, run inside your app and switch the session’s user. Approvals, time limits and access history are yours to build.
- django-hijack (Django) lets superusers hijack any active user by default. Its built-in
superusers_and_staffcheck also lets staff hijack users who are neither staff nor superusers. You can replace either with your own function, which receiveshijackerandhijacked, as its customization docs (opens in a new tab) describe. Its hijack view source (opens in a new tab) keeps the existing session’s expiry and sendshijack_startedandhijack_endedsignals you can log. - laravel-impersonate (Laravel) lets every user impersonate and be impersonated until you add
canImpersonate()andcanBeImpersonated()to your user model, as its GitHub README (opens in a new tab) explains. It includes a middleware to protect sensitive routes and events for when impersonation starts and ends. - Symfony’s
switch_useris part of the security component. It’s limited to users withROLE_ALLOWED_TO_SWITCHby default, and a custom voter can decide based on the target user, per the Symfony impersonation docs (opens in a new tab). - Pretender (Rails) swaps
current_userand keeps the real user available astrue_user, which the Pretender README says (opens in a new tab) your audit logs should use. It doesn’t check permissions itself. Its sample controller runs your own authorization method first.
Watch the defaults. A superuser-only default tempts teams to make support agents superusers, and an allow-everyone default is one forgotten method away from an incident. If you go this route, limit support to assigned customer accounts in the same permission function.
Where do support-access products fit?
A support-access product runs the workflow around the session, not the session itself. Devora is one example. A team member searches for a customer through your backend and requests read or write scope with a duration and a reason. An approver or admin in your organization reviews it, as Devora’s overview for teams (opens in a new tab) describes.
Admins can approve their own requests (opens in a new tab) unless you turn that off, and Devora records self-approval separately. Sessions last from 15 minutes to 2 days. Recording is optional and off by default. A backend guard enforces scope (opens in a new tab) on the routes you protect and fails closed for impersonated traffic.
It doesn’t replace your auth provider. Your backend issues the short-lived credential, and the route depends on your provider (opens in a new tab). Clerk is supported. Better Auth needs an existing staff session and a binding route you write. Auth0 uses an advanced Custom Token Exchange setup, WorkOS a limited application-session bridge, and custom JWT or cookie sessions a one-time handoff. Backend SDKs cover Express, Fastify, Hono, Django and FastAPI.
Know the gaps too. Devora doesn’t know which staff should handle which customers; your backend decides who can be found and impersonated. Requests have no ticket field, so a ticket reference goes in the reason. Access history covers request decisions, reasons, scope and session timing, but there’s no bulk export or API.
User impersonation tools compared by category
This table shows where each responsibility usually sits. It isn’t a ranking, and individual tools within a category differ.
| What to check | Auth-provider features | Framework libraries | Support-access product (Devora) |
|---|---|---|---|
| Who can start a session | Dashboard roles or your backend code; PropelAuth adds per-employee permission | Your permission check | Members request; an approver or admin in your organization decides |
| Which users can be targeted | Better Auth guards admin targets; Keycloak and PropelAuth support restrictions; otherwise your code | Your check, such as canBeImpersonated() or a Symfony voter | Your search and impersonation handlers |
| Approval before access | Built in only for PropelAuth, among those listed | Build it | Every request; self-approval recorded separately |
| Reason | Required by WorkOS; part of PropelAuth requests | Build it | Part of every request |
| Time limit | Provider-defined, such as 30 minutes by default in Clerk, 60 in WorkOS and 2 hours in Auth0 | Usually the normal login session | 15 minutes to 2 days, plus an idle timeout |
| Read-only enforcement | Your backend | Your backend | Backend guard on routes you protect |
| Who acted | act claim or provider logs | true_user, session state or signals | Access history; business events stay in your logs |
Two rows matter most and are easy to miss: target restrictions and read-only enforcement. A tool can record everything perfectly and still let an agent change billing settings while acting as a customer. See what a read-only session must block.
What should your requirements checklist include?
Write down your answers before comparing tools. Each item should have an owner in your team, whichever tool you choose.
- Actors. Which staff may impersonate, and how is that granted and removed?
- Targets. Which users are off-limits: your own staff, platform admins, customer owners, blocked organizations?
- Assignment. Must an agent be assigned to the customer first?
- Approval. Is it needed for every session, only for write access, or never? Can an admin approve their own request?
- Reason. Is it required, and where is it stored next to the ticket?
- Scope. Is read-only the default, and is it enforced by your backend on direct API calls?
- Time. Token lifetime, session lifetime and inactivity timeout.
- Ending access. A stop button, remote revocation, and what happens when a staff member leaves.
- Attribution. Does the real staff identity reach your application’s audit logs?
- Visibility. Does the agent always see they’re acting as a customer?
- Privacy. Is recording needed, and who may watch it?
- Maintenance. Who keeps the integration working through auth and framework upgrades?
How do you choose a user impersonation tool?
Use the category that already covers most of your checklist.
Choose your auth provider’s feature when it meets your access policy as configured, your backend already enforces restrictions using the actor claim, and the time limits fit. PropelAuth users in particular may find most of the workflow is already there.
Choose a framework library when you own your session layer, your team is small and trusted, and you’re willing to build approvals, expiry and logging yourself. It’s the cheapest start and the most code to keep.
Choose a support-access product when you need a shared request and approval queue, scoped and time-limited sessions and access history across your team, and the product has a documented route for your provider. Check its pricing model alongside the integration work.
Whatever you pick, test it in staging with synthetic accounts: an unauthorized agent, an off-limits target, a blocked write and an expired session. If Devora fits your provider, create a Devora account and try one staging session against your own checklist.
Sources
- Clerk: User impersonation (opens in a new tab)
- Auth0: Session Delegation (opens in a new tab)
- Auth0: Delegated session behavior and monitoring (opens in a new tab)
- Better Auth: Admin plugin (opens in a new tab)
- WorkOS: Impersonation (AuthKit) (opens in a new tab)
- PropelAuth: Secure user impersonation (July 22, 2026) (opens in a new tab)
- Keycloak Server Administration Guide: Fine-grained admin permissions (opens in a new tab)
- django-hijack documentation, 3.7.9: Customization (opens in a new tab)
- django-hijack source, 3.7.9: views.py (opens in a new tab)
- laravel-impersonate on GitHub (opens in a new tab)
- Symfony documentation: How to impersonate a user (opens in a new tab)
- Pretender on GitHub (opens in a new tab)
- Devora: Overview for teams (opens in a new tab)
- Devora: FAQ
- Devora: Scope and security (opens in a new tab)
- Devora: Auth providers (opens in a new tab)