public
Last active

Twitter OAuth with node-oauth for node.js+express

  • Download Gist
server.js
JavaScript
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68
var express = require('express');
var sys = require('sys');
var oauth = require('oauth');
 
var app = express.createServer();
 
var _twitterConsumerKey = "YOURTWITTERCONSUMERKEY";
var _twitterConsumerSecret = "YOURTWITTERCONSUMERSECRET";
 
function consumer() {
return new oauth.OAuth(
"https://twitter.com/oauth/request_token", "https://twitter.com/oauth/access_token",
_twitterConsumerKey, _twitterConsumerSecret, "1.0A", "http://badgestar.com/sessions/callback", "HMAC-SHA1");
}
 
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(express.logger());
app.use(express.cookieDecoder());
app.use(express.session());
});
 
app.dynamicHelpers({
session: function(req, res){
return req.session;
}
});
 
app.get('/', function(req, res){
res.send('Hello World');
});
 
app.get('/sessions/connect', function(req, res){
consumer().getOAuthRequestToken(function(error, oauthToken, oauthTokenSecret, results){
if (error) {
res.send("Error getting OAuth request token : " + sys.inspect(error), 500);
} else {
req.session.oauthRequestToken = oauthToken;
req.session.oauthRequestTokenSecret = oauthTokenSecret;
res.redirect("https://twitter.com/oauth/authorize?oauth_token="+req.session.oauthRequestToken);
}
});
});
 
app.get('/sessions/callback', function(req, res){
sys.puts(">>"+req.session.oauthRequestToken);
sys.puts(">>"+req.session.oauthRequestTokenSecret);
sys.puts(">>"+req.query.oauth_verifier);
consumer().getOAuthAccessToken(req.session.oauthRequestToken, req.session.oauthRequestTokenSecret, req.query.oauth_verifier, function(error, oauthAccessToken, oauthAccessTokenSecret, results) {
if (error) {
res.send("Error getting OAuth access token : " + sys.inspect(error) + "["+oauthAccessToken+"]"+ "["+oauthAccessTokenSecret+"]"+ "["+sys.inspect(results)+"]", 500);
} else {
req.session.oauthAccessToken = oauthAccessToken;
req.session.oauthAccessTokenSecret = oauthAccessTokenSecret;
// Right here is where we would write out some nice user stuff
consumer.get("http://twitter.com/account/verify_credentials.json", req.session.oauthAccessToken, req.session.oauthAccessTokenSecret, function (error, data, response) {
if (error) {
res.send("Error getting twitter screen name : " + sys.inspect(error), 500);
} else {
req.session.twitterScreenName = data["screen_name"];
res.send('You are signed in: ' + req.session.twitterScreenName)
}
});
}
});
});
 
app.listen(parseInt(process.env.PORT || 80));

Hello everyone!
I have all required modules installed and have copypasted this code but it doesn't run..
It says " Object # has no method 'cookieDecoder' "

If I comment the line
app.use(express.cookieDecoder());
other errors appear

change 'cookieParser'

I am new to oauth, and this is exactly what I was looking for!

Object function consumer() {
return new oauth.OAuth(
"https://twitter.com/oauth/request_token", "https://twitter.com/oauth/access_token",
_twitterConsumerKey, _twitterConsumerSecret, "1.0A", "http://8.8.8.8/sessions/callback", "HMAC-SHA1");
} has no method 'get'

@glebus, having the same issue..let me know if you figure anymore out.

I think line 56 should look like this
consumer().get("http://twitter.com/account/verify_credentials.json", req.session.oauthAccessToken, req.session.oauthAccessTokenSecret, function (error, data, response)

I do not understand. As a result, displays the message:
You are signed in: undefined

Although if you look at the contents of the data object, there is a property screen_name. I have the feeling that at the time using the data object, it is still empty.

Yea that worked for me, on line 56, consumer should be consumer() Thanks!

String req.session.twitterScreenName = data["screen_name"]; (60) returns error, because data is string, not object. Need data = JSON.parse(data);

Hope this helps!

I'm seeing the following error while trying to require in sessions:

    throw e; // process.nextTick error, or 'error' event on first tick
          ^

Error: connect.session({ secret: "string" }) required for security

Not sure if anyone else ran into this. Would appreciate any help. Thanks.

String
app.use(express.session()); (20)
must be
app.use(express.session({secret:"secret-key"}));

Thanks. I've created an updated gist with the suggested and have it working for anyone interested -- https://gist.github.com/1964797.

i have a problem with this.

req.session is undefined and so I don't get accessToken and accessTokenSecret.

and dynamicHelper is no longer present in express 3, and this may be the reason why session is not defined. i am only guessing, does anyone have any ideas why req.session is undefined???

use this in config to replace dynamic helper:

app.use(function(req, res){
res.locals = req.session;
});

See this post on stackoverflow:
http://stackoverflow.com/questions/13517375/nodejs-express-dynamichelpers-error

My problem is I can not get req.query.oauth_verifier

Problem solved thanks

I have a version of this gist that works with Express 3 and shows both twitter (OAuth) and Google (OAuth2) here: https://gist.github.com/mccahill/6378276

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.