8

Node.jsとExpressを使用してTrialPayから送信されたメッセージを認証しようとしています。TrialPayは、HMAC-MD5ハッシュを使用して要求に署名し、検証に関するこれらの指示を提供します。

これは私のコードです:

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");
    }  
});

これは明らかに機能していません(ハッシュが一致しません)。

免責事項:私はNode.jsに非常に慣れておらず、そもそもJavascriptの経験がほとんどありません。

アップデート

リンクが保護されていることに気づきませんでした。

TrialPayは、HMACに署名するための秘密鍵としてNotification-Key(アカウント情報で設定)を使用します。GETリクエストの場合、(URL内の)疑問符に続くクエリ文字列が署名されます。POSTリクエストの場合、POST本文全体が署名されます。

TrialPayがGoogleAppEngine(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 

更新2

次のreq.bodyように出力されます。

{ 
  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: 'customer@trialpay.com',
  revenue: '10.00',
  zip_code: '94041',
  country: 'US' 
}
4

2 に答える 2

5

これでうまくいくはずです:

var crypto = require('crypto');

function calculateSignature(key) {
    return function(req, res, next) {
        var hash = req.header("TrialPay-HMAC-MD5"),
            hmac = crypto.createHmac("md5", key);

        req.on("data", function(data) {
            hmac.update(data);
        });

        req.on("end", function() {
            var crypted = hmac.digest("hex");

            if(crypted === hash) {
                // Valid request
                return res.send("Success!", { "Content-Type": "text/plain" });
            } else {
                // Invalid request
                return res.send("Invalid TrialPay hash", { "Content-Type": "text/plain" }, 403);
            }
        });

        req.on("error", function(err) {
            return next(err);
        });
    }
}

app.post("/trialpay", calculateSignature("[MY MERCHANT KEY]"));
于 2012-04-25T15:51:45.647 に答える
-1

クラウドコードの解析の場合:(テスト済み)要点はexpress.bodyParserが、ハッシュに使用されるurlエンコードされた文字列を解析します。

var parseExpressRawBody = require('parse-express-raw-body');
var queryString = require('querystring');
app.post('/trialpay',parseExpressRawBody(),function(req, res) {
var hmac, calculatedSignature,payloadStr=req.body.toString();
hmac = crypto.createHmac('md5', TrialPayMerchentKey);
hmac.update(payloadStr);
calculatedSignature = hmac.digest('hex');

if (req.headers['trialpay-hmac-md5'] === calculatedSignature) {
   ~~~~~~
于 2015-07-20T04:44:27.423 に答える