Estoy intentando autenticar un mensaje enviado desde TrialPay usando Node.js y Express. TrialPay firma solicitudes con un hash HMAC-MD5 y proporciona these instructions al validar.Validación de HMAC MD5 con Node.js, Express y Trialpay
Este es mi código:
app.post('/trialpay', function(req, res) {
var key = "[MY MERCHANT KEY]";
var hash = req.header("TrialPay-HMAC-MD5");
var data = req.body.toString();
var crypted = require("crypto").createHmac("md5", key)
.update(data)
.digest("hex");
if (hash == crypted) {
res.writeHead(200, {"Content-Type": "plain/text"});
res.end("Success!");
} else {
throw new Error("Invalid TrialPay Hash");
}
});
Esto es, obviamente, no funciona (hash no coincide).
Descargo de responsabilidad: Soy muy nuevo en Node.js, y tengo poca experiencia con Javascript, para empezar.
ACTUALIZACIÓN
No me daba cuenta de que el enlace estaba protegido.
TrialPay usa su Notification-Key (configurada en la información de su cuenta) como la clave secreta para firmar el HMAC. Para solicitudes GET, la cadena de consulta que sigue al signo de interrogación (en la URL) está firmada. Para las solicitudes POST , todo el cuerpo POST está firmado.
Aquí es un ejemplo de cómo TrialPay le indica que debe validar en Google App Engine (Python):
class MyHandler(webapp.RequestHandler):
def post(self):
key = '[YOUR MERCHANT KEY]'
tphash = self.request.headers['TrialPay-HMAC-MD5']
if hmacmd5(key,self.request.body) != tphash:
logging.info('invalid trialpay hash')
return
ACTUALIZACIÓN 2
Los req.body
imprime como:
{
oid: 'sample-order-id',
sid: 'customer-sid',
order_date: '04/24/2012',
timestamp: '04/24/2012 16:28:46',
first_name: 'customer-firstname',
last_name: 'customer-lastname',
email: '[email protected]',
revenue: '10.00',
zip_code: '94041',
country: 'US'
}
Su enlace no funciona, no me dejará iniciar sesión. Dicho esto, debe mantenerse alejado de 'throw'ing dentro de sus controladores de solicitudes (básicamente, en cualquier lugar del nodo). Acepte el tercer parámetro (callback, 'next' en express lingo) y pase el error a' next' en su lugar. O mejor aún, maneje el error aquí, donde pueda, y 'res.send (403, 'Invalid TrialPay Hash')'. Además, no mencionas qué tipo de datos estás publicando, sería interesante ver qué contiene 'req.body' y especialmente' req.body.toString() ', si pudieras' console.log' que . –
Gracias por el comentario y consejo @LinusGThiel. Cuando probé 'console.log (req.body.toString());' solo imprime "[object Object]". Disculpe mi ignorancia, aquí. –
¡Eso es lo que sospechaba! ¿Qué le proporciona 'console.log (req.body)'? –