From 1ec15647dc462363d5b765f42debddbe6ef6266b Mon Sep 17 00:00:00 2001 From: vicente1992 Date: Mon, 19 Dec 2022 22:03:33 -0500 Subject: [PATCH] feat(provider): :sparkles: endpoint is added to validate the webhook token --- packages/provider/src/meta/index.js | 10 +++--- packages/provider/src/meta/server.js | 48 +++++++++++++++++++++++++--- 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/packages/provider/src/meta/index.js b/packages/provider/src/meta/index.js index e32ec51..49f5809 100644 --- a/packages/provider/src/meta/index.js +++ b/packages/provider/src/meta/index.js @@ -10,16 +10,16 @@ const URL = `https://graph.facebook.com/v15.0` * * * Necesitas las siguientes tokens y valores - * { token, numberId, vendorNumber, verify_token } + * { jwtToken, numberId, vendorNumber, verifyToken } */ class MetaProvider extends ProviderClass { metHook - token + jwtToken numberId - constructor({ token, numberId, verifyToken }, _port = 3000) { + constructor({ jwtToken, numberId, verifyToken }, _port = 3000) { super() - this.token = token + this.jwtToken = jwtToken this.numberId = numberId this.metHook = new MetaWebHookServer(verifyToken, _port) this.metHook.start() @@ -60,7 +60,7 @@ class MetaProvider extends ProviderClass { body, { headers: { - Authorization: `Bearer ${this.token}`, + Authorization: `Bearer ${this.jwtToken}`, }, } ) diff --git a/packages/provider/src/meta/server.js b/packages/provider/src/meta/server.js index 91ae8bc..cb2ac9a 100644 --- a/packages/provider/src/meta/server.js +++ b/packages/provider/src/meta/server.js @@ -5,12 +5,12 @@ const { urlencoded } = require('body-parser') class MetaWebHookServer extends EventEmitter { metaServer metaPort - verifyToken - constructor(_verifyToken, _metaPort) { + token + constructor(_token, _metaPort) { super() this.metaServer = this.buildHTTPServer() this.metaPort = _metaPort - this.verifyToken = _verifyToken + this.token = _token } /** @@ -32,14 +32,54 @@ class MetaWebHookServer extends EventEmitter { res.end(json) } + /** + * Valida el token + * @alpha + * @param {string} mode + * @param {string} token + * @example tokenIsValid('subscribe', 'MYTOKEN') + */ + tokenIsValid(mode, token) { + return mode === 'subscribe' && this.token === token + } + + /** + * Verificación del token + * @param {*} req + * @param {*} res + */ + verifyToken = (req, res) => { + const { query } = req + const mode = query['hub.mode'] + const token = query['hub.verify_token'] + const challenge = query['hub.challenge'] + + if (!mode || !token) { + return res.sendStatus(403) + } + + if (this.tokenIsValid(mode, token)) { + console.log('Webhook verified--->😎😎😎😎') + res.status(200).send(challenge) + } + + if (!this.tokenIsValid(mode, token)) { + res.sendStatus(403) + } + } + /** * Contruir HTTP Server * @returns */ buildHTTPServer = () => { + polka() + .use(urlencoded({ extended: true })) + .get('/webhook', this.verifyToken) + return polka() .use(urlencoded({ extended: true })) - .post('/meta-hook', this.incomingMsg) + .post('/webhook', this.incomingMsg) } /**