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.
-
-
-
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);
});
};