Password Management & RecoveryΒΆ
This guide covers all supported password reset and account recovery paths for MCP Gateway administrators.
OverviewΒΆ
MCP Gateway supports:
- Self-service password reset (
Forgot Passwordflow) - Admin-initiated password resets and account unlocks
- API-based password reset/unlock automation
- Emergency database-level recovery for full lockout scenarios
Password hashes use Argon2id.
Self-Service Reset (Forgot Password)ΒΆ
User flowΒΆ
- User opens login page:
/admin/login - Selects Forgot password?
- Submits email at
/admin/forgot-password - Receives one-time reset link by email
- Sets a new password at
/admin/reset-password/{token}
API endpointsΒΆ
POST /auth/email/forgot-passwordGET /auth/email/reset-password/{token}POST /auth/email/reset-password/{token}
Behavior:
- Reset tokens are one-time-use and hashed in DB
- Default token expiry: 60 minutes (
PASSWORD_RESET_TOKEN_EXPIRY_MINUTES) - Default rate limit: 5 requests / 15 minutes per email
- Forgot-password responses are generic to reduce account enumeration
If SMTP/email is not configuredΒΆ
When SMTP_ENABLED=false (default), forgot-password requests are still accepted and reset tokens are still generated, but no email is delivered.
In this mode, recovery options are:
- Use Admin -> Users to set a new password directly.
- Use admin API
PUT /auth/email/admin/users/{email}to set a new password. - For break-glass scenarios, use the database recovery steps below.
Admin UI Reset & UnlockΒΆ
Navigate to Admin -> Users (/admin/#users):
- Edit user and set a new password
- View lockout state (
failed attempts,locked until) - Click Unlock to clear lockout immediately
API-Based Admin Reset & UnlockΒΆ
Reset user passwordΒΆ
curl -X PUT "http://localhost:4444/auth/email/admin/users/user%40example.com" \
-H "Authorization: Bearer $ADMIN_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"password": "NewUserPassword123!",
"password_change_required": false
}'
Unlock user accountΒΆ
curl -X POST "http://localhost:4444/auth/email/admin/users/user%40example.com/unlock" \
-H "Authorization: Bearer $ADMIN_TOKEN"
Kubernetes / Helm RecoveryΒΆ
Method 1: Helm bootstrap password updateΒΆ
helm upgrade mcp-stack . -f values.yaml -n mcp-private
kubectl rollout status deployment/mcp-context-forge -n mcp-private
Method 2: Direct DB updateΒΆ
Generate hash inside gateway pod:
kubectl exec -n mcp-private -it deploy/mcp-context-forge -- \
python -m mcpgateway.utils.hash_password
Apply hash in DB:
UPDATE email_users
SET password_hash = 'PASTE_HASH_HERE',
password_change_required = false,
failed_login_attempts = 0,
locked_until = NULL,
password_changed_at = CURRENT_TIMESTAMP
WHERE email = 'admin@example.com';
Emergency Full Lockout ProcedureΒΆ
- Access database with platform credentials.
- Identify admin users:
- Reset password hash + unlock fields (query above).
- Validate login via
/admin/login. - Document incident and rotate temporary credentials.
ConfigurationΒΆ
Password reset controlsΒΆ
PASSWORD_RESET_ENABLEDPASSWORD_RESET_TOKEN_EXPIRY_MINUTESPASSWORD_RESET_RATE_LIMITPASSWORD_RESET_RATE_WINDOW_MINUTESPASSWORD_RESET_INVALIDATE_SESSIONSPASSWORD_RESET_MIN_RESPONSE_MS
SMTP notification controlsΒΆ
SMTP_ENABLEDSMTP_HOSTSMTP_PORTSMTP_USERSMTP_PASSWORDSMTP_FROM_EMAILSMTP_FROM_NAMESMTP_USE_TLSSMTP_USE_SSLSMTP_TIMEOUT_SECONDS
Lockout controlsΒΆ
MAX_FAILED_LOGIN_ATTEMPTSACCOUNT_LOCKOUT_DURATION_MINUTESACCOUNT_LOCKOUT_NOTIFICATION_ENABLED