Skip to content

Instantly share code, notes, and snippets.

@kyrielia
Last active February 25, 2016 11:34
Show Gist options
  • Save kyrielia/46f8c853ac9e0d27069b to your computer and use it in GitHub Desktop.
Save kyrielia/46f8c853ac9e0d27069b to your computer and use it in GitHub Desktop.
A Node.js util class for generating an OAuth Authorization header.
// Include merge and crypto-js npm packages into your package.json
var merge = require('merge');
var crypto = require('crypto');
exports.generateAuthorizationHeader = function(method, url, consumerKey, consumerSecret, additionalParams) {
if ( additionalParams === null ) {
additionalParams = {};
}
var signatureMethod = 'HMAC-SHA1';
var version = '1.0';
// Get timestamp in seconds
var timestamp = '' + Math.round(new Date().getTime() / 1000);
// Generate a random nonce
var oauthNonce = Math.random().toString(36).slice(2);
var oAuthParameters = {
oauth_consumer_key: consumerKey,
oauth_nonce: oauthNonce,
oauth_signature_method: signatureMethod,
oauth_timestamp: timestamp,
oauth_version: version
};
var signature = generateOAuthSignature(method, url, consumerSecret, merge(oAuthParameters, additionalParams));
return 'OAuth oauth_consumer_key="' + consumerKey + '",' +
'oauth_signature_method="' + signatureMethod + '",' +
'oauth_timestamp="' + timestamp + '",' +
'oauth_nonce="' + oauthNonce + '",' +
'oauth_version="' + version + '",' +
'oauth_signature="' + encodeURIComponent(signature) + '"';
};
function generateOAuthSignature(method, url, secret, parameters) {
// Order parameters by key name
var signatureParams = '';
Object.keys(parameters).sort().forEach(function(key) {
signatureParams += key.trim() + '=' + parameters[key].trim() + '&';
});
// Remove trailing ampersand
signatureParams = signatureParams.slice(0, -1);
var baseString = method.trim() + '&' + encodeURIComponent(url.trim()) + '&' + encodeURIComponent(signatureParams);
return crypto.createHmac('sha1', secret + '&').update(baseString).digest('base64');
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment