scripts/hmac/hmac-request.js (46 lines of code) (raw):
const crypto = require('crypto');
const reqwest = require('reqwest');
const url = require('url');
class HMACRequest {
constructor ({secret}) {
this.secret = secret;
}
_getToken (remoteUrl, date) {
const urlPath = url.parse(remoteUrl).pathname;
const content = [date, urlPath].join('\n');
const hmac = crypto.createHmac('sha256', this.secret);
hmac.update(content, 'utf-8');
return `HMAC ${hmac.digest('base64')}`;
}
_request (remoteUrl, method, data = {}) {
const date = new Date().toUTCString();
const token = this._getToken(remoteUrl, date);
const requestBody = {
url: remoteUrl,
method: method,
contentType: 'application/json',
headers: {
'X-Gu-Tools-HMAC-Date': date,
'X-Gu-Tools-HMAC-Token': token,
'X-Gu-Tools-Service-Name': 'DEV'
}
};
if (Object.keys(data).length > 0) {
requestBody.data = JSON.stringify(data);
}
return reqwest(requestBody);
}
get (remoteUrl) {
return this._request(remoteUrl, 'GET');
}
post (remoteUrl, data) {
return this._request(remoteUrl, 'POST', data);
}
put (remoteUrl, data) {
return this._request(remoteUrl, 'PUT', data);
}
delete (remoteUrl) {
return this._request(remoteUrl, 'DELETE');
}
}
module.exports = HMACRequest;