From d160097b8143bfbffae75a965df34cfda1ec0bd0 Mon Sep 17 00:00:00 2001 From: ZHANG Cheng Date: Wed, 27 Jun 2012 16:52:24 +0800 Subject: [PATCH] New package: accounts-weibo for Sina Weibo --- packages/accounts-weibo/package.js | 13 ++++++ packages/accounts-weibo/weibo_client.js | 18 ++++++++ packages/accounts-weibo/weibo_common.js | 8 ++++ packages/accounts-weibo/weibo_server.js | 56 +++++++++++++++++++++++++ 4 files changed, 95 insertions(+) create mode 100644 packages/accounts-weibo/package.js create mode 100644 packages/accounts-weibo/weibo_client.js create mode 100644 packages/accounts-weibo/weibo_common.js create mode 100644 packages/accounts-weibo/weibo_server.js diff --git a/packages/accounts-weibo/package.js b/packages/accounts-weibo/package.js new file mode 100644 index 0000000000..ea7fb8199d --- /dev/null +++ b/packages/accounts-weibo/package.js @@ -0,0 +1,13 @@ +Package.describe({ + summary: "Login service for Sina Weibo accounts" +}); + +Package.on_use(function(api) { + api.use('accounts', ['client', 'server']); + api.use('accounts-oauth2-helper', ['client', 'server']); + api.use('http', ['client', 'server']); + + api.add_files('weibo_common.js', ['client', 'server']); + api.add_files('weibo_server.js', 'server'); + api.add_files('weibo_client.js', 'client'); +}); diff --git a/packages/accounts-weibo/weibo_client.js b/packages/accounts-weibo/weibo_client.js new file mode 100644 index 0000000000..040246c705 --- /dev/null +++ b/packages/accounts-weibo/weibo_client.js @@ -0,0 +1,18 @@ +(function () { + Meteor.loginWithWeibo = function () { + if (!Meteor.accounts.weibo._clientId || !Meteor.accounts.weibo._appUrl) + throw new Meteor.accounts.ConfigError("Need to call Meteor.accounts.weibo.config first"); + + var state = Meteor.uuid(); + // XXX need to support configuring access_type and scope + var loginUrl = + 'https://api.weibo.com/oauth2/authorize' + + '?response_type=code' + + '&client_id=' + Meteor.accounts.weibo._clientId + + '&redirect_uri=' + Meteor.accounts.weibo._appUrl + '/_oauth/weibo?close' + + '&state=' + state; + + Meteor.accounts.oauth2.initiateLogin(state, loginUrl); + }; + +}) (); diff --git a/packages/accounts-weibo/weibo_common.js b/packages/accounts-weibo/weibo_common.js new file mode 100644 index 0000000000..940750acb4 --- /dev/null +++ b/packages/accounts-weibo/weibo_common.js @@ -0,0 +1,8 @@ +if (!Meteor.accounts.weibo) { + Meteor.accounts.weibo = {}; +} + +Meteor.accounts.weibo.config = function(clientId, appUrl) { + Meteor.accounts.weibo._clientId = clientId; + Meteor.accounts.weibo._appUrl = appUrl; +}; diff --git a/packages/accounts-weibo/weibo_server.js b/packages/accounts-weibo/weibo_server.js new file mode 100644 index 0000000000..6c857502f9 --- /dev/null +++ b/packages/accounts-weibo/weibo_server.js @@ -0,0 +1,56 @@ +(function () { + + Meteor.accounts.weibo.setSecret = function (secret) { + Meteor.accounts.weibo._secret = secret; + }; + + Meteor.accounts.oauth2.registerService('weibo', function(query) { + if (query.error) { + // The user didn't authorize access + return null; + } + + if (!Meteor.accounts.weibo._clientId || !Meteor.accounts.weibo._appUrl) + throw new Meteor.accounts.ConfigError("Need to call Meteor.accounts.weibo.config first"); + if (!Meteor.accounts.weibo._secret) + throw new Meteor.accounts.ConfigError("Need to call Meteor.accounts.weibo.setSecret first"); + + var result = getAccessToken(query); + var identity = getIdentity(result.access_token, parseInt(result.uid, 10)); + + return { + userData: {name: identity.name, screen_name: identity.screen_name}, + serviceUserId: result.uid, + serviceData: {accessToken: result.access_token} + }; + }); + + var getAccessToken = function (query) { + var result = Meteor.http.post( + "https://api.weibo.com/oauth2/access_token", {params: { + code: query.code, + client_id: Meteor.accounts.weibo._clientId, + client_secret: Meteor.accounts.weibo._secret, + redirect_uri: Meteor.accounts.weibo._appUrl + "/_oauth/weibo?close", + grant_type: 'authorization_code' + }}); + + if (result.error) // if the http response was an error + throw result.error; + if (typeof result.content === "string") + result.content = JSON.parse(result.content); + if (result.content.error) // if the http response was a json object with an error attribute + throw result.content; + return result.content; + }; + + var getIdentity = function (accessToken, userId) { + var result = Meteor.http.get( + "https://api.weibo.com/2/users/show.json", + {params: {access_token: accessToken, uid: userId}}); + + if (result.error) + throw result.error; + return result.data; + }; +})();