43 lines
1.1 KiB
JavaScript
43 lines
1.1 KiB
JavaScript
var crypto = require('crypto')
|
|
, qs = require('querystring')
|
|
;
|
|
|
|
function sha1 (key, body) {
|
|
return crypto.createHmac('sha1', key).update(body).digest('base64')
|
|
}
|
|
|
|
function rfc3986 (str) {
|
|
return encodeURIComponent(str)
|
|
.replace(/!/g,'%21')
|
|
.replace(/\*/g,'%2A')
|
|
.replace(/\(/g,'%28')
|
|
.replace(/\)/g,'%29')
|
|
.replace(/'/g,'%27')
|
|
;
|
|
}
|
|
|
|
function hmacsign (httpMethod, base_uri, params, consumer_secret, token_secret) {
|
|
// adapted from https://dev.twitter.com/docs/auth/oauth and
|
|
// https://dev.twitter.com/docs/auth/creating-signature
|
|
|
|
var querystring = Object.keys(params).sort().map(function(key){
|
|
// big WTF here with the escape + encoding but it's what twitter wants
|
|
return escape(rfc3986(key)) + "%3D" + escape(rfc3986(params[key]))
|
|
}).join('%26')
|
|
|
|
var base = [
|
|
httpMethod ? httpMethod.toUpperCase() : 'GET',
|
|
rfc3986(base_uri),
|
|
querystring
|
|
].join('&')
|
|
|
|
var key = [
|
|
consumer_secret,
|
|
token_secret || ''
|
|
].map(rfc3986).join('&')
|
|
|
|
return sha1(key, base)
|
|
}
|
|
|
|
exports.hmacsign = hmacsign
|
|
exports.rfc3986 = rfc3986
|