mirror of
https://github.com/YunoHost-Apps/rocketchat_ynh.git
synced 2024-09-03 20:16:25 +02:00
143 lines
12 KiB
JavaScript
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
|