Aller au contenu

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_on
from 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 chiffres
le code en clair est-il en base ? False
mauvais code : OtpInvalidError
bon code : accepté
le même, rejoué : OtpNotFoundError

La 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

GarantieValeur par défaut
Durée de vie du code10 minutes
Nombre d’envois par fenêtre3 par 10 minutes
Essais avant blocage5
Stockageempreinte HMAC seulement, jamais le code ni le jeton
Traçabilitéchaque issue auditée, sans jamais le code (interdiction n°13)
Canalcourriel 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.