import io import pyotp import qrcode import qrcode.image.svg def totp_provisioning_uri(secret: str, email: str) -> str: return str(pyotp.TOTP(secret).provisioning_uri(name=email, issuer_name="Forge Engine")) def totp_qrcode_svg(secret: str, email: str) -> str: """SVG (pas PNG) : la variante "image factory" par défaut de qrcode a besoin de Pillow pour produire un PNG — SvgPathImage, elle, est du pur Python, sans dépendance supplémentaire à installer juste pour un QR code affiché une seule fois par compte, à l'inscription. SvgPathImage précisément (pas le simple SvgImage) : c'est la seule des deux variantes dont le racine porte un attribut viewBox — sans lui, la règle CSS qui fait tenir le QR code dans son cadre (.totpQrWrap svg { width:100% }) n'a rien à quoi se raccorder pour mettre à l'échelle le dessin interne (en mm) : le QR code restait invisible/coupé au lieu de s'afficher. qrcode.make() préfixe toujours sa sortie d'une déclaration XML ("") — valide pour un fichier .svg autonome, mais invalide au milieu d'un document HTML : certains navigateurs n'affichent alors rien du tout à partir de ce point. On ne garde donc que ce qui commence à "