Created
January 3, 2016 00:31
-
-
Save sorenlouv/3dc83e7f6dc4cfc6bbc0 to your computer and use it in GitHub Desktop.
Parse signed request from Facebook cookie, and exchange code to access token
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var request = require('request-promise'); | |
var crypto = require('crypto'); | |
var config = {...}; | |
function getAccessToken(cookies) { | |
var cookieName = 'fbsr_' + config.client_id; | |
var signedRequest = cookies[cookieName]; | |
var code = getCode(signedRequest); | |
return exchangeCodeForAccessToken(code); | |
}; | |
function parseSignedRequest(signedRequest, secret) { | |
signedRequest = signedRequest.split('.'); | |
var encodedSig = signedRequest[0]; | |
var payload = signedRequest[1]; | |
var data = JSON.parse(new Buffer(payload, 'base64').toString()); | |
if (data.algorithm.toUpperCase() !== 'HMAC-SHA256') { | |
return null; | |
} | |
var hmac = crypto.createHmac('sha256', secret); | |
var encodedPayload = hmac.update(payload) | |
.digest('base64') | |
.replace(/\//g, '_').replace(/\+/g, '-') | |
.replace(/={1,2}$/, ''); | |
if (encodedSig !== encodedPayload) { | |
return null; | |
} | |
return data; | |
} | |
function getCode(signedRequest) { | |
var payload = parseSignedRequest(signedRequest, config.client_secret); | |
return payload.code; | |
} | |
function exchangeCodeForAccessToken(code) { | |
var url = 'https://graph.facebook.com/v2.3/oauth/access_token' + | |
'?client_id=' + config.client_id + | |
'&redirect_uri=' + | |
'&client_secret=' + config.client_secret + | |
'&code=' + code; | |
return request({ | |
url: url, | |
json: true, | |
gzip: true | |
}).then(function(response) { | |
return response.access_token; | |
}); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment