1. Enroll current identity
Sign in above, then create and verify a pending enrollment.
MFA enrollment has not started.
Realistic app · Synthetic identities only
Automate login, registration, reset links, session expiry, role permissions, bearer tokens and API keys without touching a real account system.
Public practice credentials
Shared fake password: Practice@123. It is intentionally public and must never be reused outside this sandbox.
| Username | Role | Scenario |
|---|---|---|
standard_user | Customer | Normal customer session |
admin_user | Admin | All published permissions |
manager_user | Manager | Reports and ticket updates |
employee_user | Employee | Ticket updates |
readonly_user | Read-only | Mutations disabled |
locked_user | Customer | Always locked |
expired_user | Customer | Forced password change |
slow_user | Customer | Three-second login; ?delay=0 for fast tests |
Cookie session
Sign-in has not run.
Server session
Signed out.
No session action.
Sandbox registration
No account created.
No real email
No reset requested.
No password reset.
Synthetic mailbox
No external message is sent. Reset links exist only in this sandbox.
Role-based access control
| Role | Profile | Orders | Tickets | Reports | Users |
|---|---|---|---|---|---|
| Loading role matrix. | |||||
No permission requested.
API authentication
No token issued.
Public synthetic key
No API-key request.
Tab-scoped state
No wizard state.
Advanced authentication · Synthetic only
Enroll a signed-in synthetic identity, request a bounded MFA challenge, verify its public practice OTP, or start a recovery challenge. No SMS, email, authenticator app, external identity provider, or real credential is used.
Public practice OTP: 480321. Public recovery code:RECOVER-4803. Manager and Admin scenarios report an MFA policy of required; other synthetic roles report optional.
Sign in above, then create and verify a pending enrollment.
MFA enrollment has not started.
No MFA challenge requested.
Recovery works only after the synthetic identity has enabled MFA in this isolated sandbox.
No recovery challenge requested.
Security learning points
Only password hashes are stored. The API never returns a password or hash.
Cookie-mode mutations require the same origin and the sandbox CSRF token.
Wrong, missing and locked accounts share one sign-in error; forgot-password always gives the same accepted response.
Missing or expired authentication returns 401. A signed-in role without the requested permission returns 403.
const response = await request.post('/practice/api/v1/auth/login', {
data: { username: 'manager_user', password: 'Practice@123', idleSeconds: 300 },
headers: { 'X-Lab-CSRF': csrfToken },
});
expect(response.ok()).toBeTruthy();
await page.goto('/practice/apps/auth/');
await expect(page.getByTestId('signed-in-user')).toContainText('manager_user');