Aller au contenu

Configuration

phil/standard-webhooks-bundle
# config/packages/phil_standard_webhooks.yaml
phil_standard_webhooks:
    # The keys this application signs with: whsk_ (v1a) or whsec_ (v1). The first is the current one; during a
    # rotation, the others sign beside it, so that receivers that know only the old key keep accepting.
    signing_keys: ['%env(WEBHOOK_SIGNING_KEY)%']
    # The keys deliveries are verified with: whpk_ (v1a) or whsec_ (v1).
    verification_keys: ['%env(PARTNER_PUBLIC_KEY)%']
    # How many seconds a delivery's timestamp may be from the clock, either way. 300 when left out.
    tolerance: 300
    # This receiver's name: an envelope must give it as its "audience". null, the default, accepts any.
    audience: shop
    # The Doctrine connection that keeps the processed ids; null keeps them elsewhere. "default" when left out,
    # null without DoctrineBundle.
    connection: default
    # Whether deliveries may go to a loopback, private, link-local or reserved address. false when left out.
    allow_private_networks: false
    # Whether deliveries may go to an http URL rather than https only. false when left out.
    allow_plain_http: false
    # Whether deliveries may go to localhost or under .localhost, with allow_private_networks. false when left out.
    allow_localhost: false

Chaque clé est facultative : une application qui ne fait que recevoir ne configure aucune clé de signature, une application qui ne fait qu'envoyer aucune clé de vérification. Les clés sont lues à leur première utilisation, pas à la construction du conteneur, pour qu'elles puissent venir de variables d'environnement ; une clé illisible fait échouer la première livraison qui en a besoin. Les clés de vérification sont lues par la première requête dont le contrôleur prend un argument VerifiedWebhook, et par aucune autre : une clé illisible fait répondre ce point de terminaison de webhooks par une erreur serveur, jamais une autre page de l'application.

allow_private_networks et allow_plain_http protègent l'expéditeur contre la falsification de requête côté serveur (sending.md). Ne les activez que pour des récepteurs auxquels l'application elle-même fait confiance, comme un noyau de test à http://localhost avec allow_localhost.

Refusé à la constructionMessage
Une clé que le bundle ne connaît pasUnrecognized option "…" under "phil_standard_webhooks"
audience: ''The audience is a name, or null to accept any
tolerance: 0Should be greater than or equal to 1

Générer des clés

bin/console phil:standard-webhooks:generate-key        # v1a: whsk_… for the sender, whpk_… for the receivers
bin/console phil:standard-webhooks:generate-key v1     # v1: one whsec_… shared by the sender and one receiver

La commande affiche les clés une seule fois et ne garde rien : placez le secret dans le magasin de secrets de l'application.

Les services

ServiceCe que c'est
Phil\StandardWebhooks\WebhookReceiverPublic ; sur VerificationKeyProvider, la tolérance et l'audience
Phil\StandardWebhooks\VerificationKeyProviderUn alias de Phil\StandardWebhooks\FixedKeys, les clés configurées
Phil\StandardWebhooks\Signer, Phil\StandardWebhooks\VerifierCeux de la bibliothèque
Phil\StandardWebhooksBundle\Application\SigningKeysLes clés de signature configurées
Phil\StandardWebhooksBundle\Infrastructure\Http\WebhookSenderPublic ; sur le service http_client
Phil\StandardWebhooks\ProcessedWebhookRepositoryPublic ; un alias de DbalProcessedWebhooks, avec une connexion

Les clés qui changent

Les clés configurées sont fixes. Pour des clés publiées par un expéditeur et récupérées — un document de clés, une rotation sans déploiement —, écrivez un VerificationKeyProvider et créez un alias vers lui : le récepteur l'utilise alors, et le recharge une fois avant de refuser une livraison. Les points d'extension de la bibliothèque (doc/extension-points.md de phil/standard-webhooks) en montrent un.

# config/services.yaml
services:
    App\Webhook\PublishedKeyProvider: ~
    Phil\StandardWebhooks\VerificationKeyProvider: '@App\Webhook\PublishedKeyProvider'

Il en va de même pour Phil\StandardWebhooks\ProcessedWebhookRepository, pour garder les identifiants traités ailleurs.