2012-08-15 5 views

Respuesta

10

Hice esto hace un tiempo, y terminé escribiendo una pequeña biblioteca para hacerlo. El CoffeeScript original se puede encontrar en https://gist.github.com/fbef51815ab6f062b51a#file_signed_request.coffee, aquí es una traducción de JavaScript:

var crypto = require('crypto'); 

SignedRequest = (function() { 

    function SignedRequest(secret, request) { 
    this.secret = secret; 
    this.request = request; 
    this.verify = this.verify.bind(this); 

    var parts = this.request.split('.'); 
    this.encodedSignature = parts[0]; 
    this.encoded = parts[1]; 
    this.signature = this.base64decode(this.encodedSignature); 
    this.decoded = this.base64decode(this.encoded); 
    this.data = JSON.parse(this.decoded); 
    } 

    SignedRequest.prototype.verify = function() { 
    if (this.data.algorithm !== 'HMAC-SHA256') { 
     return false; 
    } 
    var hmac = crypto.createHmac('SHA256', this.secret); 
    hmac.update(this.encoded); 
    var result = hmac.digest('base64').replace(/\//g, '_').replace(/\+/g, '-').replace(/\=/g, ''); 
    return result === this.encodedSignature; 
    }; 

    SignedRequest.prototype.base64encode = function(data) { 
    return new Buffer(data, 'utf8').toString('base64').replace(/\//g, '_').replace(/\+/g, '-').replace(/\=/g, ''); 
    }; 

    SignedRequest.prototype.base64decode = function(data) { 
    while (data.length % 4 !== 0) { 
     data += '='; 
    } 
    data = data.replace(/-/g, '+').replace(/_/g, '/'); 
    return new Buffer(data, 'base64').toString('utf-8'); 
    }; 

    return SignedRequest; 

})(); 

module.exports = SignedRequest; 

que se puede utilizar de esta manera:

var verifier = new SignedRequest(clientSecret, signedRequest); 
verifier.verify() // whether or not the signed request verifies 
verifier.data // the data from the signed request 
+0

se ve bien. ¡Muchas gracias! – Droidik

+0

¿Con qué reemplazas la sesión signedRequest? Sé que el clientSecret está dado por Facebook. De todos modos, ¿puede mostrar cómo hizo que todo funcionara para el lado del servidor API de Facebook para capturar el ID de usuario? – Lion789

+0

@Michelle cómo recuperar el pedido firmado firmado inicial. Para el Ejemplo 'app.post ('/ *', function (req, res) { console.log ('req.signed_request'); var verificador = new SignedRequest (app_secret_key, req.signed_request); verificador. verify(); console.log ('verifier.data'); res.redirect ('/'); }); ' – user1371896

Cuestiones relacionadas