langgenius/dify · error · PasswordMismatchError
password_mismatch
password_mismatch
Error message
The passwords do not match.
What it means
Raised by PasswordMismatchError in EmailRegisterResetApi.post before any token work happens. The payload fields new_password and password_confirm are compared directly; if they differ, registration aborts. This is the only guard that fires before the token is looked up, so it reveals nothing about token state.
Source
Thrown at api/controllers/console/auth/email_register.py:166
)
AccountService.reset_email_register_error_rate_limit(user_email)
return {"is_valid": True, "email": normalized_token_email, "token": new_token}
@console_ns.route("/email-register")
class EmailRegisterResetApi(Resource):
@setup_required
@email_password_login_enabled
@email_register_enabled
@console_ns.expect(console_ns.models[EmailRegisterResetPayload.__name__])
@console_ns.response(200, "Success", console_ns.models[EmailRegisterResetResponse.__name__])
@model_validate(EmailRegisterResetPayload)
def post(self, req_data: EmailRegisterResetPayload):
# Validate passwords match
if req_data.new_password != req_data.password_confirm:
raise PasswordMismatchError()
# Validate token and get register data
register_data = AccountService.get_email_register_data(req_data.token)
if not register_data:
raise InvalidTokenError()
# Must use token in reset phase
if register_data.get("phase", "") != "register":
raise InvalidTokenError()
# Revoke token to prevent reuse
AccountService.revoke_email_register_token(req_data.token)
email = register_data.get("email", "")
normalized_email = email.lower()
account = AccountService.get_account_by_email_with_case_fallback(email, session=db.session())
if account:View on GitHub (pinned to ef8544b173)
Solutions
- Compare the two password fields in the UI before submitting and disable the submit button until they match.
- Show a real-time 'passwords do not match' indicator under the confirm field.
- Clear and re-type both fields rather than patching one character.
- Ensure the form sends both fields from the same source values, not two independent inputs.
Example fix
// before
<button disabled={!password}>Sign up</button>
// after
disabled={password !== confirm || !password} Defensive patterns
Strategy: validation
Validate before calling
if (newPassword !== passwordConfirm) {
setFieldError('password_confirm', 'Passwords do not match');
return;
} Type guard
function passwordsMatch(a, b) { return typeof a === 'string' && a === b && a.length > 0; } Prevention
- Disable submit until both fields are non-empty and equal.
- Show a real-time match indicator.
- Send both fields from the same React state value.
When it happens
Trigger: POST /console/api/email-register with new_password != password_confirm in the JSON body. Pure client-side validation moved server-side as a safety net.
Common situations: Password manager autofills one field but not the other; caps-lock or different keyboard layout; user retypes differently in the confirm box; frontend skips its own equality check.
Related errors
AI-assisted analysis of langgenius/dify@ef8544b173 (2026-08-12).
Data as JSON: /api/errors/8d5421881ff42f2e.
Report an issue: GitHub.