pluto-message-ingestion/hmac-request.js (49 lines of code) (raw):
const crypto = require('crypto');
const reqwest = require('reqwest');
const url = require('url');
const logForElk = require('./logger');
class HMACRequest {
constructor({ serviceName, secret }) {
this.serviceName = serviceName;
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': this.serviceName
}
};
if (Object.keys(data).length > 0) {
requestBody.data = JSON.stringify(data);
}
logForElk(
{ message: `Making ${method} request to ${remoteUrl}`, data },
'info'
);
return reqwest(requestBody);
}
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;