diff --git a/examples/term.ie.oauth.js b/examples/term.ie.oauth.js index cc65759..5b249ee 100644 --- a/examples/term.ie.oauth.js +++ b/examples/term.ie.oauth.js @@ -2,7 +2,7 @@ var sys= require('sys') var OAuth= require('../lib/oauth').OAuth; -var oa= new OAuth("http://term.ie/oauth/example/request_token.php", +var oa= new OAuth("http://term.ie/oauth/example/request_token.php?foo=bar", "http://term.ie/oauth/example/access_token.php", null, "key", @@ -23,14 +23,8 @@ oa.getOAuthRequestToken(function(error, oauth_token, oauth_token_secret, authori sys.puts('accesstoken results :' + sys.inspect(results2)) sys.puts("Requesting access token") var data= ""; - oa.getProtectedResource("http://term.ie/oauth/example/echo_api.php?foo=bar&too=roo", "GET", oauth_access_token, oauth_access_token_secret, function (response) { - response.setEncoding('utf8'); - response.addListener('data', function (chunk) { - data+=chunk; - }); - response.addListener('end', function () { - sys.puts(response.statusCode + " : " + data); - }); + oa.getProtectedResource("http://term.ie/oauth/example/echo_api.php?foo=bar&too=roo", "GET", oauth_access_token, oauth_access_token_secret, function (error, data, response) { + sys.puts(data); }); }); } diff --git a/lib/oauth.js b/lib/oauth.js index 4b52d0d..9e0af61 100644 --- a/lib/oauth.js +++ b/lib/oauth.js @@ -3,7 +3,7 @@ var sha1= require('./sha1'), URL= require('url'), querystring= require('querystring'); -exports.OAuth= function(requestUrl, accessUrl, authorizeUrl, consumerKey, consumerSecret, version, signatureMethod) { +exports.OAuth= function(requestUrl, accessUrl, authorizeUrl, consumerKey, consumerSecret, version, signatureMethod, nonceSize) { this._requestUrl= requestUrl; this._accessUrl= accessUrl; this._authorizeUrl= authorizeUrl; @@ -11,6 +11,7 @@ exports.OAuth= function(requestUrl, accessUrl, authorizeUrl, consumerKey, consum this._consumerSecret= this._encodeData( consumerSecret ); this._version= version; this._signatureMethod= signatureMethod; + this._nonceSize= nonceSize || 32; }; exports.OAuth.prototype._getTimestamp= function() { @@ -122,72 +123,23 @@ exports.OAuth.prototype._getNonce= function(nonceSize) { return result.join(''); } -exports.OAuth.prototype.getOauthAccessToken= function(oauth_token, oauth_token_secret, callback) { - 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 method= "GET"; - var sig= this._getSignature( method, this._accessUrl, 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 parsedUrl= URL.parse( this._accessUrl, false ); - if( parsedUrl.protocol == "http:" && !parsedUrl.port ) parsedUrl.port= 80; - if( parsedUrl.protocol == "https:" && !parsedUrl.port ) parsedUrl.port= 443; - - 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', function (response) { - response.setEncoding('utf8'); - response.addListener('data', function (chunk) { - data+=chunk; - }); - response.addListener('end', function () { - if( response.statusCode != 200 ) { - callback( response.statusCode +" : " + data ); - } else { - var results= querystring.parse( data ); - var oauth_token= results["oauth_token"]; - delete results["oauth_token"]; - var oauth_token_secret= results["oauth_token_secret"]; - delete results["oauth_token_secret"]; - callback(null, oauth_token, oauth_token_secret, results ); - } - }); - }); - request.end(); - } - -exports.OAuth.prototype.getProtectedResource= function(url, method, oauth_token, oauth_token_secret, responseListener) { +exports.OAuth.prototype._performSecureRequest= function( oauth_token, oauth_token_secret, method, url, callback ) { var oauthParameters= { "oauth_timestamp": this._getTimestamp(), - "oauth_nonce": this._getNonce(32), + "oauth_nonce": this._getNonce(this._nonceSize), "oauth_version": this._version, "oauth_signature_method": this._signatureMethod, - "oauth_consumer_key": this._consumerKey, - "oauth_token": oauth_token + "oauth_consumer_key": this._consumerKey }; + if( oauth_token ) { + oauthParameters["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 ) { @@ -196,10 +148,9 @@ exports.OAuth.prototype.getProtectedResource= function(url, method, oauth_token, } 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] + "&"; @@ -210,17 +161,49 @@ exports.OAuth.prototype.getProtectedResource= function(url, method, oauth_token, 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.addListener('response', function (response) { + response.setEncoding('utf8'); + response.addListener('data', function (chunk) { + data+=chunk; + }); + response.addListener('end', function () { + if( response.statusCode != 200 ) { + callback( response.statusCode +" : " + data ); + } else { + callback(null, data, response); + } + }); + }); request.end(); } + + +exports.OAuth.prototype.getOauthAccessToken= function(oauth_token, oauth_token_secret, callback) { + this._performSecureRequest( oauth_token, oauth_token_secret, "GET", this._accessUrl, function(error, data, response) { + if( error ) callback(error); + else { + var results= querystring.parse( data ); + var oauth_access_token= results["oauth_token"]; + delete results["oauth_token"]; + var oauth_access_token_secret= results["oauth_token_secret"]; + delete results["oauth_token_secret"]; + callback(null, oauth_access_token, oauth_access_token_secret, results ); + } + }) +} + +exports.OAuth.prototype.getProtectedResource= function(url, method, oauth_token, oauth_token_secret, callback) { + this._performSecureRequest( oauth_token, oauth_token_secret, method, url, callback ); +} exports.OAuth.prototype.getOAuthRequestToken= function(callback) { var oauthParameters= { "oauth_timestamp": this._getTimestamp(), - "oauth_nonce": this._getNonce(32), + "oauth_nonce": this._getNonce(this._nonceSize), "oauth_version": this._version, "oauth_signature_method": this._signatureMethod, "oauth_consumer_key": this._consumerKey