2012-08-15 78 views

回答

10

我之前做过这个,最后写了一个小型库来完成它。原来的CoffeeScript可以在https://gist.github.com/fbef51815ab6f062b51a#file_signed_request.coffee发现,这里是一个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; 

您可以使用这样的:

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

看起来不错。非常感谢! – Droidik 2012-08-16 20:40:28

+0

你用signedRequest替换了什么?我知道clientSecret是由Facebook提供的?无论如何,你可以展示你如何让facebook api服务器端的所有东西都能够抓取userID? – Lion789 2013-08-23 19:48:35

+0

@Michelle 如何获取初始编码的signed_request。对于实施例'app.post( '/ *',函数(REQ,RES){ 的console.log( 'req.signed_request'); 变种验证=新SignedRequest(app_secret_key,req.signed_request); 验证。 (); console.log('verifier.data'); res.redirect('/'); });' – user1371896 2016-09-09 16:15:48

相关问题