(function () { /* Imports */ var Meteor = Package.meteor.Meteor; var _ = Package.underscore._; var Random = Package.random.Random; var check = Package.check.check; var Match = Package.check.Match; var WebApp = Package.webapp.WebApp; var main = Package.webapp.main; var WebAppInternals = Package.webapp.WebAppInternals; var Accounts = Package['accounts-base'].Accounts; var AccountsServer = Package['accounts-base'].AccountsServer; var OAuth = Package.oauth.OAuth; var Oauth = Package.oauth.Oauth; (function(){ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // packages/accounts-oauth/oauth_common.js // // // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Accounts.oauth = {}; // 1 // 2 var services = {}; // 3 // 4 // Helper for registering OAuth based accounts packages. // 5 // On the server, adds an index to the user collection. // 6 Accounts.oauth.registerService = function (name) { // 7 if (_.has(services, name)) // 8 throw new Error("Duplicate service: " + name); // 9 services[name] = true; // 10 // 11 if (Meteor.server) { // 12 // Accounts.updateOrCreateUserFromExternalService does a lookup by this id, // 13 // so this should be a unique index. You might want to add indexes for other // 14 // fields returned by your service (eg services.github.login) but you can do // 15 // that in your app. // 16 Meteor.users._ensureIndex('services.' + name + '.id', // 17 {unique: 1, sparse: 1}); // 18 } // 19 }; // 20 // 21 // Removes a previously registered service. // 22 // This will disable logging in with this service, and serviceNames() will not // 23 // contain it. // 24 // It's worth noting that already logged in users will remain logged in unless // 25 // you manually expire their sessions. // 26 Accounts.oauth.unregisterService = function (name) { // 27 if (!_.has(services, name)) // 28 throw new Error("Service not found: " + name); // 29 delete services[name]; // 30 }; // 31 // 32 Accounts.oauth.serviceNames = function () { // 33 return _.keys(services); // 34 }; // 35 // 36 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }).call(this); (function(){ ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // // packages/accounts-oauth/oauth_server.js // // // ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // // Listen to calls to `login` with an oauth option set. This is where // 1 // users actually get logged in to meteor via oauth. // 2 Accounts.registerLoginHandler(function (options) { // 3 if (!options.oauth) // 4 return undefined; // don't handle // 5 // 6 check(options.oauth, { // 7 credentialToken: String, // 8 // When an error occurs while retrieving the access token, we store // 9 // the error in the pending credentials table, with a secret of // 10 // null. The client can call the login method with a secret of null // 11 // to retrieve the error. // 12 credentialSecret: Match.OneOf(null, String) // 13 }); // 14 // 15 var result = OAuth.retrieveCredential(options.oauth.credentialToken, // 16 options.oauth.credentialSecret); // 17 // 18 if (!result) { // 19 // OAuth credentialToken is not recognized, which could be either // 20 // because the popup was closed by the user before completion, or // 21 // some sort of error where the oauth provider didn't talk to our // 22 // server correctly and closed the popup somehow. // 23 // // 24 // We assume it was user canceled and report it as such, using a // 25 // numeric code that the client recognizes (XXX this will get // 26 // replaced by a symbolic error code at some point // 27 // https://trello.com/c/kMkw800Z/53-official-ddp-specification). This // 28 // will mask failures where things are misconfigured such that the // 29 // server doesn't see the request but does close the window. This // 30 // seems unlikely. // 31 // // 32 // XXX we want `type` to be the service name such as "facebook" // 33 return { type: "oauth", // 34 error: new Meteor.Error( // 35 Accounts.LoginCancelledError.numericError, // 36 "No matching login attempt found") }; // 37 } // 38 // 39 if (result instanceof Error) // 40 // We tried to login, but there was a fatal error. Report it back // 41 // to the user. // 42 throw result; // 43 else { // 44 if (!_.contains(Accounts.oauth.serviceNames(), result.serviceName)) { // 45 // serviceName was not found in the registered services list. // 46 // This could happen because the service never registered itself or // 47 // unregisterService was called on it. // 48 return { type: "oauth", // 49 error: new Meteor.Error( // 50 Accounts.LoginCancelledError.numericError, // 51 "No registered oauth service found for: " + result.serviceName) }; // 52 // 53 } // 54 return Accounts.updateOrCreateUserFromExternalService(result.serviceName, result.serviceData, result.options); } // 56 }); // 57 // 58 ///////////////////////////////////////////////////////////////////////////////////////////////////////////////////// }).call(this); /* Exports */ if (typeof Package === 'undefined') Package = {}; Package['accounts-oauth'] = {}; })(); //# sourceMappingURL=accounts-oauth.js.map