WooCommerce Webhooks Auth (Geheimnis & Signatur) – wie man es benutzt
Lesezeit: 4 Minuten
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”)
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");
}
});
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
gokcand
Die Signatur muss anhand des Bodys und nicht des darin enthaltenen JSON überprüft werden. dh die rohen Bytes des req.body.
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!")
}
13932000cookie-checkWooCommerce Webhooks Auth (Geheimnis & Signatur) – wie man es benutztyes
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