1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/rocketchat_ynh.git synced 2024-09-03 20:16:25 +02:00
rocketchat_ynh/sources/programs/server/packages/facebook.js
2016-04-29 16:32:48 +02:00

143 lines
12 KiB
JavaScript

(function () {
/* Imports */
var Meteor = Package.meteor.Meteor;
var OAuth = Package.oauth.OAuth;
var Oauth = Package.oauth.Oauth;
var HTTP = Package.http.HTTP;
var HTTPInternals = Package.http.HTTPInternals;
var _ = Package.underscore._;
var ServiceConfiguration = Package['service-configuration'].ServiceConfiguration;
/* Package-scope variables */
var Facebook;
(function(){
////////////////////////////////////////////////////////////////////////////////////////////////////
// //
// packages/facebook/facebook_server.js //
// //
////////////////////////////////////////////////////////////////////////////////////////////////////
//
Facebook = {}; // 1
// 2
var querystring = Npm.require('querystring'); // 3
// 4
// 5
OAuth.registerService('facebook', 2, null, function(query) { // 6
// 7
var response = getTokenResponse(query); // 8
var accessToken = response.accessToken; // 9
// 10
// include all fields from facebook // 11
// http://developers.facebook.com/docs/reference/login/public-profile-and-friend-list/ // 12
var whitelisted = ['id', 'email', 'name', 'first_name', // 13
'last_name', 'link', 'gender', 'locale', 'age_range']; // 14
// 15
var identity = getIdentity(accessToken, whitelisted); // 16
// 17
var serviceData = { // 18
accessToken: accessToken, // 19
expiresAt: (+new Date) + (1000 * response.expiresIn) // 20
}; // 21
// 22
// 23
var fields = _.pick(identity, whitelisted); // 24
_.extend(serviceData, fields); // 25
// 26
return { // 27
serviceData: serviceData, // 28
options: {profile: {name: identity.name}} // 29
}; // 30
}); // 31
// 32
// checks whether a string parses as JSON // 33
var isJSON = function (str) { // 34
try { // 35
JSON.parse(str); // 36
return true; // 37
} catch (e) { // 38
return false; // 39
} // 40
}; // 41
// 42
// returns an object containing: // 43
// - accessToken // 44
// - expiresIn: lifetime of token in seconds // 45
var getTokenResponse = function (query) { // 46
var config = ServiceConfiguration.configurations.findOne({service: 'facebook'}); // 47
if (!config) // 48
throw new ServiceConfiguration.ConfigError(); // 49
// 50
var responseContent; // 51
try { // 52
// Request an access token // 53
responseContent = HTTP.get( // 54
"https://graph.facebook.com/v2.2/oauth/access_token", { // 55
params: { // 56
client_id: config.appId, // 57
redirect_uri: OAuth._redirectUri('facebook', config), // 58
client_secret: OAuth.openSecret(config.secret), // 59
code: query.code // 60
} // 61
}).content; // 62
} catch (err) { // 63
throw _.extend(new Error("Failed to complete OAuth handshake with Facebook. " + err.message),
{response: err.response}); // 65
} // 66
// 67
// If 'responseContent' parses as JSON, it is an error. // 68
// XXX which facebook error causes this behvaior? // 69
if (isJSON(responseContent)) { // 70
throw new Error("Failed to complete OAuth handshake with Facebook. " + responseContent); // 71
} // 72
// 73
// Success! Extract the facebook access token and expiration // 74
// time from the response // 75
var parsedResponse = querystring.parse(responseContent); // 76
var fbAccessToken = parsedResponse.access_token; // 77
var fbExpires = parsedResponse.expires; // 78
// 79
if (!fbAccessToken) { // 80
throw new Error("Failed to complete OAuth handshake with facebook " + // 81
"-- can't find access token in HTTP response. " + responseContent); // 82
} // 83
return { // 84
accessToken: fbAccessToken, // 85
expiresIn: fbExpires // 86
}; // 87
}; // 88
// 89
var getIdentity = function (accessToken, fields) { // 90
try { // 91
return HTTP.get("https://graph.facebook.com/v2.4/me", { // 92
params: { // 93
access_token: accessToken, // 94
fields: fields // 95
} // 96
}).data; // 97
} catch (err) { // 98
throw _.extend(new Error("Failed to fetch identity from Facebook. " + err.message), // 99
{response: err.response}); // 100
} // 101
}; // 102
// 103
Facebook.retrieveCredential = function(credentialToken, credentialSecret) { // 104
return OAuth.retrieveCredential(credentialToken, credentialSecret); // 105
}; // 106
// 107
////////////////////////////////////////////////////////////////////////////////////////////////////
}).call(this);
/* Exports */
if (typeof Package === 'undefined') Package = {};
Package.facebook = {
Facebook: Facebook
};
})();
//# sourceMappingURL=facebook.js.map