Aller au contenu

Push & alertes de sécurité

Une fois un utilisateur appairé, le backend pousse deux familles de notifications vers ses appareils, toutes signées en HMAC #1 :

  • send/auth-challenge — une invite Approuver / Refuser (TOTP, golden number, biométrie).
  • send/security-alert — une notification passive (sans boutons), par exemple « nouvelle connexion approuvée ».

Les deux diffusent (fan-out) vers tous les jetons d’appareil que l’utilisateur a enregistrés pour le tenant appelant.

custom_type choisit l’UX rendue par l’appareil (totp, goldenNumber ou localAuth). instruction_id est votre identifiant de corrélation — réutilisez-le ensuite avec fetch/delivery-status. ttl_seconds va de 10 à 600 (défaut 180).

Fenêtre de terminal
curl $BASE_URL/api/v1/relay/send/auth-challenge \
-X POST \
-H "X-Bloonio-Tenant-Id: tnt_..." \
-H "X-Bloonio-Timestamp: 1718966400000" \
-H "X-Bloonio-Signature: <hex_hmac_sha256>" \
-H "Content-Type: application/json" \
-d '{
"user_socket_hash": "9f86d081884c7d659a2feaa0c55ad015",
"instruction_id": "instr_abc123",
"custom_type": "totp",
"expected_action": "transfer_funds",
"backend_url": "https://api.example.com",
"description": "Confirmer un virement",
"ttl_seconds": 180
}'

Vous pouvez joindre un bloc d’affichage structuré (display) pour que l’app rende des champs typés (montant, IBAN masqué, nom de partie, etc.) :

{
"display": {
"title": "Confirmer le virement",
"subtitle": "Vérifiez les détails avant d'approuver",
"fields": [
{ "key": "amount", "title": "Montant", "value": "1000 USD", "data_type": "CURRENCY_USD" },
{ "key": "to", "title": "Bénéficiaire", "value": "ACME Corp", "data_type": "PARTY_NAME" }
]
}
}

Réponse en cas de livraison vers au moins un appareil :

{
"success": true,
"status_code": 200,
"message": "Challenge pushed to 1 device(s)",
"data": {
"instruction_id": "instr_abc123",
"delivered_count": 1,
"failed_count": 0,
"fcm_message_ids": ["projects/.../messages/..."],
"failed_tokens_sample": [],
"sent_at": "2026-06-21T..."
}
}

Notification passive — pas de catégorie de challenge, pas de boutons Approuver / Refuser. kind est un indice de sévérité (sign_in, security, info) que l’app mappe sur une icône / teinte de la boîte de réception. ttl_seconds va de 60 à 604 800 (défaut 86 400).

Fenêtre de terminal
curl $BASE_URL/api/v1/relay/send/security-alert \
-X POST \
-H "X-Bloonio-Tenant-Id: tnt_..." \
-H "X-Bloonio-Timestamp: 1718966400000" \
-H "X-Bloonio-Signature: <hex_hmac_sha256>" \
-H "Content-Type: application/json" \
-d '{
"user_socket_hash": "9f86d081884c7d659a2feaa0c55ad015",
"title": "Nouvelle connexion",
"body": "Une nouvelle connexion web a été approuvée sur votre compte.",
"kind": "sign_in",
"notification_id": "ntf_abc123"
}'
{
"success": true,
"status_code": 200,
"message": "Security alert pushed to 1 device(s)",
"data": {
"instruction_id": "ntf_abc123",
"delivered_count": 1,
"failed_count": 0,
"fcm_message_ids": ["projects/.../messages/..."],
"failed_tokens_sample": [],
"sent_at": "2026-06-21T..."
}
}

Les codes d’échec (404 / 502 / 503) sont identiques à ceux de send/auth-challenge.

Récupérez l’enregistrement de livraison d’un push déjà envoyé, par instruction_id.

Fenêtre de terminal
curl "$BASE_URL/api/v1/relay/fetch/delivery-status?instruction_id=instr_abc123" \
-H "X-Bloonio-Tenant-Id: tnt_..." \
-H "X-Bloonio-Timestamp: 1718966400000" \
-H "X-Bloonio-Signature: <hex_hmac_sha256>"

S’il n’existe aucun enregistrement pour cet instruction_id, le relais renvoie 404.