diff --git a/.travis.yml b/.travis.yml index 47c6a2a..c2ba3f9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,4 +1,3 @@ language: node_js node_js: - - 0.8 - - 0.9 \ No newline at end of file + - 0.8 \ No newline at end of file diff --git a/examples/connect_with_oauth_middleware.js b/examples/connect_with_oauth_middleware.js index 828990d..5e18a34 100644 --- a/examples/connect_with_oauth_middleware.js +++ b/examples/connect_with_oauth_middleware.js @@ -15,8 +15,8 @@ var weibo = require('../'); * init weibo api settings */ -weibo.init('weibo', '1306060637', '0850d7407392fb537bff0762406c567d'); -weibo.init('github', '8e14edfda73a71f1f226', '1796ac639a8ada0dff6acfee2d63390440ca0f3b'); +weibo.init('weibo', '1122960051', 'e678e06f627ffe0e60e2ba48abe3a1e3'); +// weibo.init('github', '8e14edfda73a71f1f226', '1796ac639a8ada0dff6acfee2d63390440ca0f3b'); weibo.init('tqq', '801196838', '9f1a88caa8709de7dccbe3cae4bdc962'); /** diff --git a/examples/gtap_server.js b/examples/gtap_server.js deleted file mode 100644 index a3c56c2..0000000 --- a/examples/gtap_server.js +++ /dev/null @@ -1,9 +0,0 @@ -var port = process.env.PORT || 8080; -require('weibo').start_gtap(port, process.env.HOME); -console.log('listen on ' + port); -process.on('uncaughtException', function (err) { - var util = require('util'); - console.error('Uncaught exception: ' + err); - console.error(err.message); - console.error(err.stack); -}); \ No newline at end of file diff --git a/examples/testMiddleWare.js b/examples/testMiddleWare.js deleted file mode 100644 index d0be9ca..0000000 --- a/examples/testMiddleWare.js +++ /dev/null @@ -1,41 +0,0 @@ -var weibo = require('../node-weibo'), - home_url = 'http://localhost:8024/oauth', - tapi = weibo.tapi, - express = require('express'), - app = express.createServer(), - port = 8024; - -var sinaApp = { - key : '1306060637', - secret : '0850d7407392fb537bff0762406c567d', - blogType: 'tsina' -} - -var qqApp = { - key : '801004324', - secret : 'f4dccb3a9f1689adcc66dc933b38445e', - blogType: 'tqq' -} - -var sohuApp = { - key : 'geDQ7cFZ7iruNPHm3lZk', - secret : 'iQ%mtL!eh%xVl!SjQN^($Efdw41!#Ytt*r8SMtw8', - blogType: 'tsohu' -} - -var apps = [sinaApp , qqApp , sohuApp]; - -for(var i = 0 ; i < apps.length; i++) { - tapi.init(apps[i].blogType, apps[i].key, apps[i].secret); -} - -app.listen(port); -console.log('paint app started on port '+port); - -app.use(weibo.oauth_middleware(function(oauth_user, referer, req, res, callback) { - // do something ... - // save oauth_user - console.log(oauth_user); - callback(); -})); - diff --git a/gtap/public/sign-in-with-twitter-d.png b/gtap/public/sign-in-with-twitter-d.png deleted file mode 100644 index b49a0ba..0000000 Binary files a/gtap/public/sign-in-with-twitter-d.png and /dev/null differ diff --git a/gtap/server.js b/gtap/server.js deleted file mode 100644 index 3a2190b..0000000 --- a/gtap/server.js +++ /dev/null @@ -1,145 +0,0 @@ -/** - * Module dependencies. - */ - -var connect = require('connect') - , fs = require('fs') - , urlutil = require('url') - , tapi = require('../lib/tapi') - , twitter = tapi.api_dispatch({blogtype: 'twitter'}) - , oauth = require('../lib/oauth_middleware'); - -exports.start = function(port, store_dir) { - store_dir = store_dir || process.cwd(); - /** - * Gtap APPKEY: http://code.google.com/p/gtap/source/browse/trunk/main.py - * CONSUMER_KEY = 'xzR7LOq6Aeq8uAaGORJHGQ' - * CONSUMER_SECRET = 'bCgaGEfejtE9mzq5pTMZngjnjd6rRL7hf2WBFjT4' - */ - tapi.init('twitter', 'Bs03m4guPuksRtIBuvntxw', 'EwwTc3q4xEwxmm9OQnpy7cZdt43HYepeO8wdElGI'); - - function redirect(res, url) { - res.writeHead(302, { - 'Location': url, - 'Content-Length': 0 - }); - res.end(); - }; - - // Load the library - var nStore = require('nstore'); - // Create a store - var cache = nStore.new(store_dir + '/gtap_oauth_user_cache.db', function (){ - // It's loaded now - }); - - var views = { - '/': fs.readFileSync(__dirname + '/views/index.html'), - '/setting': fs.readFileSync(__dirname + '/views/setting.html') - }; - - var server = connect.createServer( - connect.bodyParser(), - connect.static(__dirname + '/public'), - connect.favicon(), - connect.cookieParser(), - connect.session({secret: 'gtap-server-session-secret'}), - oauth(function(oauth_user, referer, req, res, callback) { - var key = req.session.user.username + req.session.user.password; - cache.save(key, oauth_user, function(err) { - if(err) { console.error(err); } - redirect(res, '/user_info'); - callback(true); - }); - }, {default_blogtype: 'twitter'}), - function(req, res, next) { - if(req.url == '/') { - var user = req.session.user; - if(user) { - var key = user.username + user.password; - cache.get(key, function(err, oauth_user, k) { - if(oauth_user) { - redirect(res, '/user_info'); - } else { - res.end(views['/setting']); - } - }); - } else { - res.end(views['/']); - } - } else if(req.url == '/login') { - if(!req.body) { - return redirect(res, '/'); - } - var user = {username: req.body.username, password: req.body.password}; - var key = user.username + user.password; - cache.get(key, function(err, oauth_user, k) { - if(err) { - console.log('cache.get ' + key + ' user: ' + user.username + ' error: ' + err.message); - } - if(oauth_user) { - req.session.user = user; - redirect(res, '/user_info'); - } else { - req.session.user = user; - redirect(res, '/'); - } - }); - } else if(req.url == '/user_info') { - if(!req.session.user) { - return redirect(res, '/'); - } - res.writeHeader(200, {'Content-type': 'text/html'}); - res.end(req.session.user.username + '(' + req.session.user.password - + ') has connect to twitter.
Gtap api: ' - + '
Logout, you still can use the api proxy.'); - } else if(req.url == '/logout') { - req.session.user = null; - redirect(res, '/'); - } else { - next(); - } - }, - function(req, res, next) { - var urlinfo = urlutil.parse(req.url, true); - if(urlinfo.pathname.indexOf('/api') === 0) { - urlinfo.pathname = urlinfo.pathname.substring(4); - } - var data = urlinfo.query; - if(req.body) { - for(var k in req.body) { - data[k] = req.body[k]; - } - } - delete data.source; - var authorization = req.headers.authorization; - if (!authorization) return connect.utils.unauthorized(res, ''); - - var parts = authorization.split(' ') - , scheme = parts[0] - , credentials = new Buffer(parts[1], 'base64').toString().split(':'); - - if ('Basic' != scheme) return connect.utils.badRequest(res); - var key = credentials[0] + credentials[1]; - cache.get(key, function(err, oauth_user, k) { - var params = { - url: urlinfo.pathname, - play_load: 'string', - type: req.method, - user: oauth_user, - data: data - }; - twitter._send_request(params, function(err, s, response) { - if(err) { - s = JSON.stringify(err); - } - res.writeHead(response.statusCode, response.headers); - res.end(s); - }); - }); - } - ); - port = port || 8080; - server.listen(port); - console.log('server start listen on ' + port); -}; \ No newline at end of file diff --git a/gtap/views/index.html b/gtap/views/index.html deleted file mode 100644 index 55776a9..0000000 --- a/gtap/views/index.html +++ /dev/null @@ -1,19 +0,0 @@ - - - - - Node Gtap API for Twitter - - - -

Node Gtap API for Twitter

-

Setup the username and random password

-
- - - - - -
- - diff --git a/gtap/views/setting.html b/gtap/views/setting.html deleted file mode 100644 index 3280fff..0000000 --- a/gtap/views/setting.html +++ /dev/null @@ -1,14 +0,0 @@ - - - - - Node Gtap API for Twitter - - - -

Node Gtap API for Twitter

-

- Fuck GFW first. connect twitter -

- - diff --git a/lib/oauth_middleware.js b/lib/oauth_middleware.js index 7c12554..c032292 100644 --- a/lib/oauth_middleware.js +++ b/lib/oauth_middleware.js @@ -1,150 +1,158 @@ -/*! - * node-weibo - oauth_middleware for connect - * Copyright(c) 2012 fengmk2 - * MIT Licensed - */ - -/** - * Module dependencies. - */ - -var tapi = require('./tapi'); - -function getReferer(req, options) { - var referer = req.headers.referer || '/'; - if (referer.indexOf(options.loginPath) === 0 || referer.indexOf(options.logoutPath) === 0) { - referer = '/'; - } - return referer; -} - -function redirect(res, url) { - res.writeHead(302, { - Location: url - }); - res.end(); -} - -function login(req, res, next, options) { - var blogtypeField = options.blogtypeField; - var blogtype = req.query[blogtypeField]; - var referer = getReferer(req, options); - if (!options.homeUrl) { - options.homeUrl = 'http://' + req.headers.host; - } - var authCallback = options.homeUrl + options.callbackPath + - '?' + blogtypeField + '=' + blogtype; - var user = { blogType: blogtype, oauth_callback: authCallback }; - tapi.get_authorization_url(user, function (err, authInfo) { - if (err) { - return next(err); - } - if (typeof authInfo === 'string') { - authInfo = { - auth_url: authInfo - }; - } - authInfo.referer = referer; - req.session.oauthInfo = authInfo; - redirect(res, authInfo.auth_url); - }); -} - -function logout(req, res, next, options) { - options.beforeLogout(req, res, function (err) { - if (err) { - return next(err); - } - var referer = getReferer(req, options); - req.session.oauthUser = null; - redirect(res, referer); - }); -} - -function oauthCallback(req, res, next, options) { - var blogType = req.query[options.blogtypeField]; - var oauthInfo = req.session.oauthInfo || {}; - req.session.oauthInfo = null; - var oauth_token = req.query.oauth_token || req.query.code; - var user = { - blogType: blogType, - oauth_token_key: oauth_token, - oauth_verifier: req.query.oauth_verifier, - oauth_token_secret: oauthInfo.oauth_token_secret, - state: req.query.state, - }; - var referer = oauthInfo.referer; - tapi.get_access_token(user, function (err, accessToken) { - if (err) { - return next(err); - } - // get user info - tapi.verify_credentials(accessToken, function (err, user) { - if (err) { - return next(err); - } - for (var k in accessToken) { - user[k] = accessToken[k]; - } - req.session.oauthUser = user; - options.afterLogin(req, res, function (err) { - if (err) { - return next(err); - } - redirect(res, referer); - }); - }); - }); -} - -function defaultCallback(req, res, callback) { - callback(); -} - -/** - * oauth middleware for connect - * - * example: - * - * connect( - * connect.query(), - * connect.cookieParser('I\'m cookie secret.'), - * connect.session({ secret: "oh year a secret" }), - * weibo.oauth() - * ); - * - * @param {Object} [options] - * - {String} [homeUrl], use to create login success oauth_callback url with referer header, - * default is `'http://' + req.headers.host`; - * - {String} [loginPath], login url, default is '/oauth' - * - {String} [logoutPath], default is '/oauth/logout' - * - {String} [callbackPath], default is login_path + '/callback' - * - {String} [blogtypeField], default is 'type', - * if you want to connect weibo, login url should be '/oauth?type=weibo' - * - {Function(req, res, callback)} [afterLogin], when oauth login success, will call this function. - * - {Function(req, res, callback)} [beforeLogout], will call this function before user logout. - */ - -module.exports = function oauth(options) { - options = options || {}; - if (options.homeUrl) { - options.homeUrl = options.homeUrl.replace(/\/+$/, ''); - } - options.loginPath = options.loginPath || '/oauth'; - options.logoutPath = options.logoutPath || '/ouath/logout'; - options.callbackPath = options.callbackPath || (options.loginPath + '/callback'); - options.blogtypeField = options.blogtypeField || 'type'; - options.afterLogin = options.afterLogin || defaultCallback; - options.beforeLogout = options.beforeLogout || defaultCallback; - return function (req, res, next) { - if (req.url.indexOf(options.callbackPath) === 0) { - oauthCallback(req, res, next, options); - } else if (req.url.indexOf(options.loginPath) === 0) { - login(req, res, next, options); - } else if (req.url.indexOf(options.logoutPath) === 0) { - logout(req, res, next, options); - } else { - next(); - } - }; -}; +/*! + * node-weibo - oauth_middleware for connect + * Copyright(c) 2012 fengmk2 + * MIT Licensed + */ + +/** + * Module dependencies. + */ + +var tapi = require('./tapi'); + +function getReferer(req, options) { + var referer = req.headers.referer || '/'; + if (referer.indexOf(options.loginPath) === 0 || referer.indexOf(options.logoutPath) === 0) { + referer = '/'; + } + return referer; +} + +function redirect(res, url) { + res.writeHead(302, { + Location: url + }); + res.end(); +} + +function login(req, res, next, options) { + var blogtypeField = options.blogtypeField; + var blogtype = req.query[blogtypeField]; + var referer = getReferer(req, options); + if (!options.homeUrl) { + options.homeUrl = 'http://' + req.headers.host; + } + var authCallback = options.homeUrl + options.callbackPath + + '?' + blogtypeField + '=' + blogtype; + var user = { + blogtype: blogtype, + oauth_callback: authCallback + }; + tapi.get_authorization_url(user, function (err, authInfo) { + if (err) { + return next(err); + } + authInfo.blogtype = blogtype; + authInfo.referer = referer; + req.session.oauthInfo = authInfo; + redirect(res, authInfo.auth_url); + }); +} + +function logout(req, res, next, options) { + options.beforeLogout(req, res, function (err) { + if (err) { + return next(err); + } + var referer = getReferer(req, options); + req.session.oauthUser = null; + redirect(res, referer); + }); +} + +function oauthCallback(req, res, next, options) { + var oauthInfo = req.session.oauthInfo || {}; + var blogtype = req.query[options.blogtypeField] || oauthInfo.blogtype; + req.session.oauthInfo = null; + var token = req.query; + token.blogtype = blogtype; + if (oauthInfo.oauth_token_secret) { + token.oauth_token_secret = oauthInfo.oauth_token_secret; + } + // var oauth_token = req.query.oauth_token; + // var oauth_verifier = req.query.oauth_verifier || req.query.code || req.query.oauth_pin; + // var user = { + // blogtype: blogtype, + // oauth_token: oauth_token, + // oauth_verifier: oauth_verifier, + // oauth_token_secret: oauthInfo.oauth_token_secret, + // state: req.query.state, + // }; + // if (req.query.state) { + // user.state = req.query.state; + // } + var referer = oauthInfo.referer; + tapi.get_access_token(token, function (err, accessToken) { + if (err) { + return next(err); + } + // get user info + tapi.verify_credentials(accessToken, function (err, user) { + if (err) { + return next(err); + } + for (var k in accessToken) { + user[k] = accessToken[k]; + } + req.session.oauthUser = user; + options.afterLogin(req, res, function (err) { + if (err) { + return next(err); + } + redirect(res, referer); + }); + }); + }); +} + +function defaultCallback(req, res, callback) { + callback(); +} + +/** + * oauth middleware for connect + * + * example: + * + * connect( + * connect.query(), + * connect.cookieParser('I\'m cookie secret.'), + * connect.session({ secret: "oh year a secret" }), + * weibo.oauth() + * ); + * + * @param {Object} [options] + * - {String} [homeUrl], use to create login success oauth_callback url with referer header, + * default is `'http://' + req.headers.host`; + * - {String} [loginPath], login url, default is '/oauth' + * - {String} [logoutPath], default is '/oauth/logout' + * - {String} [callbackPath], default is login_path + '/callback' + * - {String} [blogtypeField], default is 'type', + * if you want to connect weibo, login url should be '/oauth?type=weibo' + * - {Function(req, res, callback)} [afterLogin], when oauth login success, will call this function. + * - {Function(req, res, callback)} [beforeLogout], will call this function before user logout. + */ + +module.exports = function oauth(options) { + options = options || {}; + if (options.homeUrl) { + options.homeUrl = options.homeUrl.replace(/\/+$/, ''); + } + options.loginPath = options.loginPath || '/oauth'; + options.logoutPath = options.logoutPath || '/ouath/logout'; + options.callbackPath = options.callbackPath || (options.loginPath + '/callback'); + options.blogtypeField = options.blogtypeField || 'type'; + options.afterLogin = options.afterLogin || defaultCallback; + options.beforeLogout = options.beforeLogout || defaultCallback; + return function (req, res, next) { + if (req.url.indexOf(options.callbackPath) === 0) { + oauthCallback(req, res, next, options); + } else if (req.url.indexOf(options.loginPath) === 0) { + login(req, res, next, options); + } else if (req.url.indexOf(options.logoutPath) === 0) { + logout(req, res, next, options); + } else { + next(); + } + }; +}; diff --git a/lib/tbase.js b/lib/tbase.js index 594ab10..19c3696 100644 --- a/lib/tbase.js +++ b/lib/tbase.js @@ -308,6 +308,7 @@ TBase.prototype.get_authorization_url = function (user, callback) { oauth_callback: user.oauth_callback || self.config.oauth_callback }; info = token; + info.blogtype = user.blogtype; info.auth_url = self.format_authorization_url(params); } callback(err, info); @@ -335,7 +336,9 @@ TBase.prototype.get_request_token = function (user, callback) { if (err) { return callback(err); } - callback(null, querystring.parse(token)); + token = querystring.parse(token); + token.blogtype = user.blogtype; + callback(null, token); }); return this; }, @@ -370,7 +373,9 @@ TBase.prototype.get_access_token = function (user, callback) { if (err) { return callback(err); } - callback(null, querystring.parse(token)); + token = querystring.parse(token); + token.blogtype = user.blogtype; + callback(null, token); }); return this; }; diff --git a/lib/tbase_oauth_v2.js b/lib/tbase_oauth_v2.js index 6f10fce..bd8ba42 100644 --- a/lib/tbase_oauth_v2.js +++ b/lib/tbase_oauth_v2.js @@ -32,6 +32,7 @@ TBaseOauthV2.prototype.get_authorization_url = function (user, callback) { }; params = utils.extend(params, this.config.oauth_params); var info = { + blogtype: user.blogtype, auth_url: this.format_authorization_url(params) }; process.nextTick(function () { @@ -72,6 +73,7 @@ TBaseOauthV2.prototype.get_access_token = function (user, callback) { // uid: '1827455832' } token = JSON.parse(token); token.oauth_token = token.access_token; + token.blogtype = user.blogtype; callback(null, token); }); };