Skip to content

Instantly share code, notes, and snippets.

@santosh79
Created March 3, 2012 07:04
Show Gist options
  • Save santosh79/1964797 to your computer and use it in GitHub Desktop.
Save santosh79/1964797 to your computer and use it in GitHub Desktop.
Twitter OAuth with node-oauth for node.js+express
var express = require('express');
var sys = require('util');
var oauth = require('oauth');
var app = express.createServer();
var _twitterConsumerKey = process.env['TWITTER_CONSUMER_KEY'];
var _twitterConsumerSecret = process.env['TWITTER_CONSUMER_SECRET'];
console.log("_twitterConsumerKey: %s and _twitterConsumerSecret %s", process.env['TWITTER_CONSUMER_KEY'], process.env['TWITTER_CONSUMER_SECRET']);
function consumer() {
return new oauth.OAuth(
"https://twitter.com/oauth/request_token", "https://twitter.com/oauth/access_token",
_twitterConsumerKey, _twitterConsumerSecret, "1.0A", "http://your.domain/sessions/callback", "HMAC-SHA1");
}
app.configure('development', function(){
app.use(express.errorHandler({ dumpExceptions: true, showStack: true }));
app.use(express.logger());
app.use(express.cookieParser());
app.use(express.session({
secret: "secretkey"
}));
});
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 {
console.log("data is %j", data);
data = JSON.parse(data);
req.session.twitterScreenName = data["screen_name"];
res.send('You are signed in: ' + req.session.twitterScreenName)
}
});
}
});
});
app.listen(parseInt(process.env.PORT || 80));
@jgendr2
Copy link

jgendr2 commented Mar 3, 2012

Thanks for the update. Can you explain what process.env is? and where can you set these values? Thanks.

@santosh79
Copy link
Author

Sure - process.env returns all the environment variables in your system. For the sake of this example, I kept it simple and secure by requiring the access token and secret be passed in as environment variables. In order to run this you would do:

TWITTER_CONSUMER_KEY="yourAppKey" TWITTER_CONSUMER_SECRET="yourAppSecret" node twitter-oauth.js

In the command line.

@jgendr2
Copy link

jgendr2 commented Mar 3, 2012

Thanks for sharing.

@celestialcitizen
Copy link

I get the following error

[Error: 2712:error:140770FC:SSL routines:SSL23_GET_SERVER_HELLO:unknown protocol:openssl\ssl\s23_clnt.c:607:
]

Any ideas as to how to rectify the same ??

@kyledetella
Copy link

Everything seems to work. However, I did have to change the endpoint for the credentials to : https://api.twitter.com/1.1/account/verify_credentials.json . (via: https://dev.twitter.com/docs/api/1.1/get/account/verify_credentials)

@gabmontes
Copy link

Thanks for the example!

Is there any reason why URLs are twitter.com instead of api.twitter.com as documented on dev.twitter.com/?

@novalagung
Copy link

thanks, this run great

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment