feat: improve signup UX - send login link if email already registered

When user tries to signup with an already registered email, the system
now sends a login link instead of showing an error. This improves UX and
prevents user enumeration attacks. The response message is identical for
both new registrations and existing emails.
This commit is contained in:
XPS\Micro 2026-02-01 17:04:07 +01:00
parent eca7beefbd
commit 5115e37b47

36
api.py
View File

@ -101,7 +101,41 @@ def api_signup():
# Prüfe ob Email bereits registriert
existing_user = User.query.filter_by(email=email).first()
if existing_user:
return jsonify({'error': 'Diese Email-Adresse ist bereits registriert'}), 409
# Statt Fehler: Sende Login-Link (bessere UX, verhindert User-Enumeration)
if existing_user.is_blocked:
return jsonify({'error': 'Dein Account wurde gesperrt'}), 403
# Rate-Limiting prüfen
if not check_rate_limit(email):
return jsonify({'error': 'Zu viele Anfragen. Bitte versuche es später erneut.'}), 429
# Generiere Magic Link Token für Login
token = generate_magic_link_token()
expires_at = datetime.utcnow() + timedelta(seconds=Config.MAGIC_LINK_TOKEN_EXPIRY)
magic_token = MagicLinkToken(
user_id=existing_user.id,
token=token,
token_type='login',
expires_at=expires_at,
ip_address=request.remote_addr
)
db.session.add(magic_token)
db.session.commit()
# Sende Email
try:
send_magic_link_email(email, token, 'login')
except Exception as e:
current_app.logger.error(f"Email-Versand fehlgeschlagen: {str(e)}")
return jsonify({'error': 'Email konnte nicht gesendet werden'}), 500
current_app.logger.info(f"[SIGNUP] Email {email} existiert bereits - Login-Link gesendet")
# Gleiche Nachricht wie bei Neuregistrierung (verhindert User-Enumeration)
return jsonify({
'message': 'Registrierungs-Link wurde an deine Email gesendet. Bitte überprüfe dein Postfach.'
}), 200
# Rate-Limiting
if not check_rate_limit(email):