From 71f54afccda4a538aa279f52946e09bcb81fafbb Mon Sep 17 00:00:00 2001 From: Matt DeBergalis Date: Sun, 10 Mar 2013 15:10:22 -0700 Subject: [PATCH] accounts-meetup package --- packages/accounts-meetup/meetup_client.js | 25 ++++++++++ packages/accounts-meetup/meetup_common.js | 3 ++ .../accounts-meetup/meetup_configure.html | 20 ++++++++ packages/accounts-meetup/meetup_configure.js | 10 ++++ .../accounts-meetup/meetup_login_button.css | 5 ++ packages/accounts-meetup/meetup_server.js | 47 +++++++++++++++++++ packages/accounts-meetup/package.js | 18 +++++++ 7 files changed, 128 insertions(+) create mode 100644 packages/accounts-meetup/meetup_client.js create mode 100644 packages/accounts-meetup/meetup_common.js create mode 100644 packages/accounts-meetup/meetup_configure.html create mode 100644 packages/accounts-meetup/meetup_configure.js create mode 100644 packages/accounts-meetup/meetup_login_button.css create mode 100644 packages/accounts-meetup/meetup_server.js create mode 100644 packages/accounts-meetup/package.js diff --git a/packages/accounts-meetup/meetup_client.js b/packages/accounts-meetup/meetup_client.js new file mode 100644 index 0000000000..450af0589c --- /dev/null +++ b/packages/accounts-meetup/meetup_client.js @@ -0,0 +1,25 @@ +(function () { + Meteor.loginWithMeetup = function (options, callback) { + // support both (options, callback) and (callback). + if (!callback && typeof options === 'function') { + callback = options; + options = {}; + } + + var config = Accounts.loginServiceConfiguration.findOne({service: 'meetup'}); + if (!config) { + callback && callback(new Accounts.ConfigError("Service not configured")); + return; + } + var state = Random.id(); + + var loginUrl = + 'https://secure.meetup.com/oauth2/authorize' + + '?client_id=' + config.clientId + + '&response_type=code' + + '&redirect_uri=' + Meteor.absoluteUrl('_oauth/meetup?close') + + '&state=' + state; + + Accounts.oauth.initiateLogin(state, loginUrl, callback, {width: 900, height: 450}); + }; +}) (); diff --git a/packages/accounts-meetup/meetup_common.js b/packages/accounts-meetup/meetup_common.js new file mode 100644 index 0000000000..4eb47fff80 --- /dev/null +++ b/packages/accounts-meetup/meetup_common.js @@ -0,0 +1,3 @@ +if (!Accounts.meetup) { + Accounts.meetup = {}; +} diff --git a/packages/accounts-meetup/meetup_configure.html b/packages/accounts-meetup/meetup_configure.html new file mode 100644 index 0000000000..67116f8ec8 --- /dev/null +++ b/packages/accounts-meetup/meetup_configure.html @@ -0,0 +1,20 @@ + diff --git a/packages/accounts-meetup/meetup_configure.js b/packages/accounts-meetup/meetup_configure.js new file mode 100644 index 0000000000..df8c36afc2 --- /dev/null +++ b/packages/accounts-meetup/meetup_configure.js @@ -0,0 +1,10 @@ +Template.configureLoginServiceDialogForMeetup.siteUrl = function () { + return Meteor.absoluteUrl(); +}; + +Template.configureLoginServiceDialogForMeetup.fields = function () { + return [ + {property: 'clientId', label: 'Key'}, + {property: 'secret', label: 'Secret'} + ]; +}; \ No newline at end of file diff --git a/packages/accounts-meetup/meetup_login_button.css b/packages/accounts-meetup/meetup_login_button.css new file mode 100644 index 0000000000..4f2d4c6cf5 --- /dev/null +++ b/packages/accounts-meetup/meetup_login_button.css @@ -0,0 +1,5 @@ +#login-buttons-image-meetup.login-image { + top: 8px; + height: 11px; + background-image: url(data:image/png;base64,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); +} diff --git a/packages/accounts-meetup/meetup_server.js b/packages/accounts-meetup/meetup_server.js new file mode 100644 index 0000000000..39369e40c4 --- /dev/null +++ b/packages/accounts-meetup/meetup_server.js @@ -0,0 +1,47 @@ +(function () { + Accounts.oauth.registerService('meetup', 2, function(query) { + + var accessToken = getAccessToken(query); + var identity = getIdentity(accessToken); + + return { + serviceData: { + id: identity.id, + accessToken: accessToken + }, + options: {profile: {name: identity.name}} + }; + }); + + var getAccessToken = function (query) { + var config = Accounts.loginServiceConfiguration.findOne({service: 'meetup'}); + if (!config) + throw new Accounts.ConfigError("Service not configured"); + + var result = Meteor.http.post( + "https://secure.meetup.com/oauth2/access", {headers: {Accept: 'application/json'}, params: { + code: query.code, + client_id: config.clientId, + client_secret: config.secret, + grant_type: 'authorization_code', + redirect_uri: Meteor.absoluteUrl("_oauth/meetup?close"), + state: query.state + }}); + if (result.error) // if the http response was an error + throw result.error; + if (result.data.error) // if the http response was a json object with an error attribute + throw result.data; + + return result.data.access_token; + }; + + var getIdentity = function (accessToken) { + var result = Meteor.http.get( + "https://secure.meetup.com/2/members", + {params: {member_id: 'self', access_token: accessToken}}); + if (result.error) + throw result.error; + + return result.data.results && result.data.results[0]; + }; +}) (); \ No newline at end of file diff --git a/packages/accounts-meetup/package.js b/packages/accounts-meetup/package.js new file mode 100644 index 0000000000..332253c2cc --- /dev/null +++ b/packages/accounts-meetup/package.js @@ -0,0 +1,18 @@ +Package.describe({ + summary: "Login service for Meetup accounts" +}); + +Package.on_use(function(api) { + api.use('accounts-base', ['client', 'server']); + api.use('accounts-oauth2-helper', ['client', 'server']); + api.use('http', ['client', 'server']); + api.use('templating', 'client'); + + api.add_files( + ['meetup_login_button.css', 'meetup_configure.html', 'meetup_configure.js'], + 'client'); + + api.add_files('meetup_common.js', ['client', 'server']); + api.add_files('meetup_server.js', 'server'); + api.add_files('meetup_client.js', 'client'); +});