Faire agir quelqu'un sans compte
Un client doit signer un devis. Un fournisseur doit confirmer une date. Ces gens n’ont pas de compte chez vous, n’en auront jamais, et il est hors de question de leur en créer un.
Le noyau fournit la brique : un lien qui désigne une ressource, et un code à usage unique envoyé par courriel pour prouver que c’est bien le destinataire qui l’ouvre.
from kewos.secure_link import issue_link_on, request_otp_on, verify_otp_onfrom kewos.secure_link.types import OtpPurpose
with engine.begin() as conn: token, ctx = issue_link_on( conn, resource_kind="library_loan", resource_ref="19", recipient_email="lecteur@example.test", scope="loan:read", secret_key=key, )token est la seule copie en clair : vous le mettez dans l’URL du courriel, et il n’est
enregistré nulle part. Exécuté :
jeton en clair : kws_sl_2_f... (50 caractères)en base : 67cac6636cba5ff24d3b... (le jeton en clair y est ? False)Une base volée ne donne aucun lien utilisable : elle ne contient que des empreintes.
Le code à usage unique
with engine.begin() as conn: request_otp_on( conn, link_id=ctx.link_id, purpose=OtpPurpose.OPEN, recipient_email="lecteur@example.test", from_address="no-reply@exemple.test", render_email=mon_gabarit, secret_key=key, )Le courriel part par la file transactionnelle (interdiction n°17) : si votre transaction échoue, le code n’est jamais envoyé. Exécuté :
code : 6 chiffresle code en clair est-il en base ? Falsemauvais code : OtpInvalidErrorbon code : acceptéle même, rejoué : OtpNotFoundErrorLa dernière ligne est la propriété qui compte : un code sert une fois. Il est consommé à la vérification, donc rejouer le même courriel intercepté ne donne rien.
Ce que le noyau tient pour vous
| Garantie | Valeur par défaut |
|---|---|
| Durée de vie du code | 10 minutes |
| Nombre d’envois par fenêtre | 3 par 10 minutes |
| Essais avant blocage | 5 |
| Stockage | empreinte HMAC seulement, jamais le code ni le jeton |
| Traçabilité | chaque issue auditée, sans jamais le code (interdiction n°13) |
| Canal | courriel uniquement, jamais SMS |
Le blocage après cinq essais est ce qui rend six chiffres acceptables : sans lui, un code court se devine.
Deux consentements plutôt qu’un
OtpPurpose distingue ouvrir (OPEN) et agir (APPLY). Ce sont deux codes séparés, et
c’est délibéré : consulter un document et le signer ne sont pas le même acte. Un tiers qui a
ouvert n’a pas encore consenti.