WooCommerce Webhooks Auth (Geheimnis & Signatur) – wie man es benutzt

Lesezeit: 4 Minuten

Benutzeravatar von Unicco
Unico

Ich versuche, eine Integration zwischen zu schaffen WooCommerce-Webhook-API und mein Node.js-Backend. Ich kann jedoch nicht wirklich herausfinden, wie ich das Geheimnis verwenden soll, um die Anfrage zu authentifizieren.

secret: ein optionaler geheimer Schlüssel, der zum Generieren von a verwendet wird HMAC-SHA256 Hash des Anfragetexts, damit der Empfänger die Authentizität des Webhook überprüfen kann.

X-WC-Webhook-Signature: ein Base64-codierter HMAC-SHA256-Hash der Nutzlast.

WooCommerce-Backend:
(Hemmeliged = “Geheimnis”)
Geben Sie hier die Bildbeschreibung ein

Nodejs-Backend:

var bodyParser = require('body-parser');
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: false }));

router.post("https://stackoverflow.com/", function (req, res) {
    var secret="ciPV6gjCbu&efdgbhfgj&¤"#&¤GDA";
    var signature = req.header("x-wc-webhook-signature");
    var hash = CryptoJS.HmacSHA256(req.body, secret).toString(CryptoJS.enc.Base64);

    if(hash === signature){
        res.send('match');
    } else {
        res.send("no match");
    }

});

Quelle: https://github.com/woocommerce/woocommerce/pull/5941

WooCommerce-REST-API-Quelle

Der Hash und die Signatur stimmen nicht überein. Was ist falsch?

Aktualisieren:
console.log gibt diese Werte zurück:

hash: pU9kXddJPY9MG9i2ZFLNTu3TXZA++85pnwfPqMr0dg0=

signature: PjKImjr9Hk9MmIdUMc+pEmCqBoRXA5f3Ac6tnji7exU=

hash (without .toString(CryptoJS.enc.Base64)): a54f645dd7493d8f4c1bd8b66452cd4eedd35d903efbce699f07cfa8caf4760d

  • Benutzt du evtl bodyParser? req.body ist nicht unbedingt eine Zeichenfolge.

    – Fingersatz

    9. Januar 2018 um 16:09 Uhr

  • @fingeron Ja, ich verwende bodyParser. Ich habe das Codeschnipsel aktualisiert. Ich habe versucht var body = req.body.toString(‘utf8’); auch, hilft aber nicht.

    – Unico

    9. Januar 2018 um 17:56 Uhr


  • @Unicco Würden Sie console.log() für Hash und Signatur hinzufügen. (Hash ohne toString() addiert mit toString() )

    – gokcand

    9. Januar 2018 um 19:47 Uhr

  • @gokcand Ich habe die Frage aktualisiert.

    – Unico

    9. Januar 2018 um 20:39 Uhr

  • @gokcand Entschuldigung für die Verzögerung. Ich hatte noch nicht wirklich die Zeit, es mir anzusehen. Ich habe Ihre Lösung gestern implementiert, bekam aber einige Fehler. Ich hatte keine Zeit, diese zu reparieren. Ich werde mich heute eingehender mit Ihrer Antwort befassen. Hast du es selbst getestet?

    – Unico

    12. Januar 2018 um 11:01 Uhr

Benutzeravatar von gokcand
gokcand

Die Signatur muss anhand des Bodys und nicht des darin enthaltenen JSON überprüft werden. dh die rohen Bytes des req.body.

Modifiziere den bodyParser Erste:

const rawBodySaver = (req, res, buf, encoding) => {
  if (buf && buf.length) {
    req.rawBody = buf.toString(encoding || 'utf8');
  }
};

app.use(bodyParser.json({ verify: rawBodySaver }));
app.use(bodyParser.urlencoded({ verify: rawBodySaver, extended: true }));
app.use(bodyParser.raw({ verify: rawBodySaver, type: '*/*' }));

und dann mit Krypto (Es wird mit Knoten verteilt, die Sie nicht benötigen npm install irgendetwas.)

import crypto from 'crypto'; //Let's try with built-in crypto lib instead of cryptoJS

router.post("https://stackoverflow.com/", function (req, res) {
  const secret="ciPV6gjCbu&efdgbhfgj&¤"#&¤GDA";
  const signature = req.header("X-WC-Webhook-Signature");

  const hash = crypto.createHmac('SHA256', secret).update(req.rawBody).digest('base64');

  if(hash === signature){
    res.send('match');
  } else {
    res.send("no match");
  }
});

  • Vielen Dank. Sie müssen req.header ändern[“”] zu req.header(“”). Es tut mir leid, aber Signatur und Hash stimmen nicht überein. Dies sind die Ausgaben nach der Implementierung des Puffers: Hash: pU9kXddJPY9MG9i2ZFLNTu3TXZA++85pnwfPqMr0dg0= Signatur: 2Od/YW7laO4EtqdsO3CvOcXPTIEFCY5qVZdKdWSJcKU=

    – Unico

    10. Januar 2018 um 8:40 Uhr


  • Wenn ich bodyparser entferne, ist req.body einfach leer. Ich habe versucht, den privaten geheimen Schlüssel in etwas Einfacheres zu ändern – das hilft auch nicht. Ich glaube, dass Bodyparser erforderlich ist, um auf den Körper zuzugreifen. trotzdem bin ich mir nicht sicher, wie ich anders darauf zugreifen kann.

    – Unico

    10. Januar 2018 um 11:51 Uhr


  • @Unicco Ja, stimmt, wir brauchen bodyParser, um auf req.body zuzugreifen. Ich habe die Antwort aktualisiert, können Sie sie bitte noch einmal überprüfen? Versuchen Sie vor allem den zweiten Weg.

    – gokcand

    10. Januar 2018 um 13:10 Uhr

  • Vielen Dank. Ich werde diese Ansätze so schnell wie möglich ausprobieren und Sie wissen lassen.

    – Unico

    10. Januar 2018 um 14:49 Uhr

Ich hoffe, unten wird jemand etwas Zeit sparen.

// Make sure to add a WISTIA_SECRET_KEY in your Environment Variables
// See https://docs.pipedream.com/environment-variables/
const secret = process.env.SELF_AUTOMATE_KEY;
const signature = event.headers["x-wc-webhook-signature"];
const body = steps.trigger.raw_event["body_b64"];
const clean_Body = body.replace("body_b64: ", "");
//const body = steps.trigger.raw_event;
console.log(event.headers["x-wc-webhook-signature"]);

console.log("Print Body", clean_Body);

if (process.env.SELF_AUTOMATE_KEY === undefined) {
  $end("No WISTIA_SECRET_KEY environment variable defined. Exiting.")
}

if (!("x-wc-webhook-signature" in event.headers)) {
  $end("No x-wc-webhook-signature header present in the request. Exiting.")
}

// Once we've confirmed we have a signature, we want to 
// validate it by generating an HMAC SHA-256 hexdigest
const crypto = require('crypto');

const hash = crypto.createHmac('sha256',
  secret).update(JSON.stringify(clean_Body), 'base64').digest('base64');



console.log(hash);
// $end() ends the execution of a pipeline, presenting a nice message in the "Messages"
// column in the inspector above. See https://docs.pipedream.com/notebook/code/#end
if (hash !== signature) {
  $end("The correct secret key was not passed in the event. Exiting!")
}

1393200cookie-checkWooCommerce Webhooks Auth (Geheimnis & Signatur) – wie man es benutzt

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy