Files
Forge-Engine/templates/auth/forgot_password.html
T
williamandClaude Sonnet 5 d5a84413d1 Ajoute la réinitialisation de mot de passe par email (SMTP)
Un lien "Mot de passe oublié ?" (login.html) mène à /forgot-password :
si l'adresse saisie correspond à un compte, un jeton à haute entropie
(secrets.token_urlsafe, valable 1h) est généré et envoyé par email via
smtplib (auth/send_email.py, aucune dépendance ajoutée) — configuré
uniquement par variables d'environnement (SMTP_HOST/PORT/USER/PASSWORD/
FROM, voir .env.example et docker-compose.prod.yml), n'importe quel
serveur SMTP existant convient (Mailcow compris).

Seul le hash SHA-256 du jeton est stocké (auth/password_reset.py, table
_password_reset_tokens) : un jeton envoyé par email reste inutilisable
même en cas de fuite de la base. Le même message générique s'affiche que
l'adresse corresponde à un compte ou non, pour ne jamais permettre à ce
formulaire de servir à deviner quelles adresses sont déjà inscrites. Un
échec d'envoi (SMTP non configuré) est journalisé côté serveur seulement,
jamais révélé à l'utilisateur.

/reset-password/<token> vérifie le jeton (non expiré, non déjà utilisé),
applique les mêmes règles de mot de passe fort qu'à l'inscription (même
schéma visuel), puis consomme le jeton et remet à zéro le compteur
anti-bruteforce du compte (auth/set_password.py) — une identité prouvée
par email est une voie de récupération légitime même pour un compte
verrouillé.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-28 20:50:49 +02:00

27 lines
1.2 KiB
HTML

{% extends "base.html" %}
{% block title %}Mot de passe oublié — Forge Engine{% endblock %}
{% block content %}
<section class="section">
<div class="container" style="max-width:420px;">
<h1 class="title">Mot de passe oublié</h1>
{% if sent %}
<div class="notification is-success">Si un compte existe avec cette adresse, un email vient de t'être envoyé avec un lien pour choisir un nouveau mot de passe.</div>
<p class="hint mt-3"><a href="{{ url_for('login') }}">Retour à la connexion</a></p>
{% else %}
<p class="hint mb-4">Indique ton adresse email : si un compte y est associé, un lien de réinitialisation te sera envoyé.</p>
<form method="post" action="{{ url_for('forgot_password') }}" autocomplete="off">
<div class="field">
<label class="label">Adresse email</label>
<div class="control"><input class="input" type="email" name="email" required autofocus></div>
</div>
<div class="field mt-4">
<button type="submit" class="button primary is-fullwidth">Envoyer le lien</button>
</div>
</form>
<p class="hint mt-3"><a href="{{ url_for('login') }}">Retour à la connexion</a></p>
{% endif %}
</div>
</section>
{% endblock %}