From 2bf33d156be5b41f38de6e031d3cfd6e6ca5fcb7 Mon Sep 17 00:00:00 2001 From: ciaranj Date: Mon, 19 Apr 2010 22:02:36 +0100 Subject: [PATCH] Added a method to access protected resources. --- Readme.md | 4 +++- examples/term.ie.oauth.js | 37 ++++++++++++++++++++++++++++++ lib/oauth.js | 48 +++++++++++++++++++++++++++++++++++++-- 3 files changed, 86 insertions(+), 3 deletions(-) create mode 100644 examples/term.ie.oauth.js diff --git a/Readme.md b/Readme.md index 841c3ca..e1287cd 100644 --- a/Readme.md +++ b/Readme.md @@ -1,3 +1,5 @@ node-oauth =========== -A simple oauth API for node.js . This API allows users to authenticate against OAUTH providers, and thus act as OAuth consumers \ No newline at end of file +A simple oauth API for node.js . This API allows users to authenticate against OAUTH providers, and thus act as OAuth consumers + +Tested against both Twitter (http://twitter.com) and term.ie (http://term.ie/oauth/example/) \ No newline at end of file diff --git a/examples/term.ie.oauth.js b/examples/term.ie.oauth.js new file mode 100644 index 0000000..ec1a0f2 --- /dev/null +++ b/examples/term.ie.oauth.js @@ -0,0 +1,37 @@ +var sys= require('sys') + +var OAuth= require('../lib/oauth').OAuth; + +var oa= new OAuth("http://term.ie/oauth/example/request_token.php", + "http://term.ie/oauth/example/access_token.php", + null, + "key", + "secret", + "1.0", + "HMAC-SHA1") + +oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, authorize_url, results){ + if(error) sys.puts('error :' + error) + else { + sys.puts('oauth_token :' + oauth_token) + sys.puts('oauth_token_secret :' + oauth_token_secret) + sys.puts('requestoken results :' + sys.inspect(results)) + sys.puts("Requesting access token") + oa.getOauthAccessToken(oauth_token, oauth_token_secret, function(error, oauth_access_token, oauth_access_token_secret, results2) { + sys.puts('oauth_access_token :' + oauth_access_token) + sys.puts('oauth_token_secret :' + oauth_access_token_secret) + sys.puts('accesstoken results :' + sys.inspect(results2)) + sys.puts("Requesting access token") + var data= ""; + oa.getProtectedResource(oauth_access_token, oauth_access_token_secret, "http://term.ie/oauth/example/echo_api.php?foo=bar&too=roo", function (response) { + response.setEncoding('utf8'); + response.addListener('data', function (chunk) { + data+=chunk; + }); + response.addListener('end', function () { + sys.puts(response.statusCode + " : " + data); + }); + }); + }); + } +}) \ No newline at end of file diff --git a/lib/oauth.js b/lib/oauth.js index 14bed89..f5b6cbf 100644 --- a/lib/oauth.js +++ b/lib/oauth.js @@ -164,9 +164,9 @@ exports.OAuth.prototype.getOauthAccessToken= function(oauth_token, oauth_token_s } else { var results= querystring.parse( data ); var oauth_token= results["oauth_token"]; - results["oauth_token"]= undefined; + delete results["oauth_token"]; var oauth_token_secret= results["oauth_token_secret"]; - results["oauth_token_secret"]= undefined; + delete results["oauth_token_secret"]; callback(null, oauth_token, oauth_token_secret, results ); } }); @@ -174,6 +174,50 @@ exports.OAuth.prototype.getOauthAccessToken= function(oauth_token, oauth_token_s request.end(); } +exports.OAuth.prototype.getProtectedResource= function(oauth_token, oauth_token_secret, url, responseListener) { + var oauthParameters= { + "oauth_timestamp": this._getTimestamp(), + "oauth_nonce": this._getNonce(32), + "oauth_version": this._version, + "oauth_signature_method": this._signatureMethod, + "oauth_consumer_key": this._consumerKey, + "oauth_token": oauth_token + }; + + var parsedUrl= URL.parse( url, false ); + if( parsedUrl.protocol == "http:" && !parsedUrl.port ) parsedUrl.port= 80; + if( parsedUrl.protocol == "https:" && !parsedUrl.port ) parsedUrl.port= 443; + + if( parsedUrl.query ) { + var extraParameters= querystring.parse(parsedUrl.query); + for(var key in extraParameters ) { + oauthParameters[key]= extraParameters[key]; + } + } + + var method= "GET"; + var sig= this._getSignature( method, url, this._normaliseRequestParams(oauthParameters), oauth_token_secret); + + var orderedParameters= this._sortRequestParams( oauthParameters ); + orderedParameters[orderedParameters.length]= ["oauth_signature", sig]; + + var query=""; + for( var i= 0 ; i < orderedParameters.length; i++) { + query+= orderedParameters[i][0]+"="+ orderedParameters[i][1] + "&"; + } + query= query.substring(0, query.length-1); + + + var oauthProvider= http.createClient(parsedUrl.port, parsedUrl.hostname); + var headers= {'Host': parsedUrl.hostname} + var request = oauthProvider.request(method, parsedUrl.pathname + "?" + query, headers); + var data=""; + var self= this; + request.addListener('response', responseListener); + request.end(); +} + + exports.OAuth.prototype.getOAuthRequestToken= function(callback) { var oauthParameters= { "oauth_timestamp": this._getTimestamp(),