Signature intégrée
<bf-signing> affiche la page de signature de Bona Fide dans un iframe isolé (bac à sable) à l’intérieur de votre
page, l’ajuste à la taille du document et signale les actions du signataire sous forme d’événements DOM. Il ne dépend
d’aucun cadriciel; de minces adaptateurs React et Vue sont inclus.
-
Créez l’enveloppe avec
delivery: "embedded", pour que les destinataires ne reçoivent pas de courriel. -
Créez une session sur votre serveur quand le signataire ouvre la page, en indiquant l’origine de votre site dans
allowedOrigins. La page intégrée refuse de communiquer avec toute page parente qui n’y figure pas.// Your backend (never expose the API key to the browser)const res = await fetch(`https://api.bonafidesign.com/v1/envelopes/${envelopeId}/sessions`, {method: 'POST',headers: { Authorization: `Bearer ${process.env.BONA_FIDE_API_KEY}`, 'Content-Type': 'application/json' },body: JSON.stringify({ recipient: recipientId, mode: 'embedded', allowedOrigins: ['https://app.example.com'] }),});const { token } = await res.json(); // 'bfs_…', single-use, 10 minutes by default -
Affichez l’élément avec le jeton.
<script type="module" src="https://js.bonafidesign.com/v1"></script><bf-signing session="bfs_…" theme="auto" min-height="480" max-height="90vh"></bf-signing><script>const el = document.querySelector('bf-signing');el.addEventListener('completed', (e) => {// e.detail = { type: 'completed', envelope: 'env_…' }window.location.href = '/onboarding/next';});el.addEventListener('session_expiring', () => refreshSession());el.addEventListener('error', (e) => console.error(e.detail.code, e.detail.message));</script>import { BonaFideSigning } from '@bona-fide/embed/react';export function SignContract({ token }: { token: string }) {return (<BonaFideSigningsession={token}theme="auto"minHeight={480}maxHeight="90vh"onCompleted={(e) => console.log('envelope completed', e.envelope)}onDeclined={(e) => console.log('declined', e.reason)}onSessionExpiring={() => refreshSession()}onError={(e) => console.error(e.code, e.message)}/>);}<script setup lang="ts">import { BonaFideSigning } from '@bona-fide/embed/vue';defineProps<{ token: string }>();const done = (e: { envelope: string }) => console.log('envelope completed', e.envelope);</script><template><BonaFideSigning :session="token" theme="auto" :min-height="480" max-height="90vh" @completed="done" /></template> -
Confirmez sur votre serveur. Considérez l’événement du navigateur comme un simple signal pour l’interface et fiez-vous au webhook
envelope.completed(ou àGET /v1/envelopes/{id}) pour connaître le résultat.
Attributs
Section intitulée « Attributs »| Attribut (prop React / Vue) | Valeur par défaut | Remarques |
|---|---|---|
session |
Le jeton bfs_…. Le modifier recharge le cadre |
|
base-url (baseUrl) |
https://sign.bonafidesign.com/s/ |
La route de signature hébergée du déploiement |
theme |
auto |
auto, light ou dark |
locale |
Transmis à la page de signature | |
min-height, max-height (minHeight, maxHeight) |
480, 90vh |
En pixels ou en vh. Le cadre s’agrandit avec le document entre ces deux valeurs, puis défile à l’intérieur |
timeout |
30000 |
Délai d’attente de la page, en millisecondes, avant une error avec le code load_timeout |
frame-title |
Document signing |
Le titre accessible de l’iframe |
L’élément dispose aussi d’une méthode reload(), par exemple après la création d’une nouvelle session.
Événements
Section intitulée « Événements »Les événements remontent dans le DOM, traversent les racines fantômes (shadow roots) et transportent leurs données
dans event.detail. bf-event est déclenché pour chacun d’eux.
| Événement | detail |
|---|---|
ready |
{ type: 'ready' } : la page de signature est chargée |
field_completed |
{ type, field } : un champ a été rempli |
signed |
{ type, recipient } : ce destinataire a soumis |
completed |
{ type, envelope } : l’enveloppe est finalisée |
declined |
{ type, reason? } |
session_expiring |
{ type, expiresAt } : créez bientôt une nouvelle session |
error |
{ type, code, message }, y compris load_timeout et invalid_base_url |
Les props React sont onReady, onFieldCompleted, onSigned, onCompleted, onDeclined, onSessionExpiring,
onError et onEvent; Vue émet les noms des événements (@completed, @session_expiring, …) et event.
Modèle de sécurité
Section intitulée « Modèle de sécurité »- Le jeton circule dans le fragment de l’URL de l’iframe (
#session=…), qui n’atteint jamais un serveur ni un en-têteReferer. La page de signature le lit, le retire de l’URL et de l’historique, puis l’échange contre un jeton d’accès conservé en mémoire. Aucun témoin n’est utilisé. - L’iframe est isolé (
allow-scripts allow-same-origin allow-forms allow-popups allow-popups-to-escape-sandbox allow-downloads) avecreferrerpolicy="strict-origin". - Votre page n’accepte un message que s’il provient de l’iframe propre à l’élément et de l’origine de
base-urlet s’il s’analyse comme un messagebona-fide.embed/1doté de son espace de noms. Tout le reste est ignoré. - La page de signature envoie ses messages à votre origine exacte (jamais
*), et seulement si cette origine figure dans lesallowedOriginsde la session. L’API refuse aussi les appels d’une session intégrée qui proviennent d’origines non autorisées.