exports.signHeaders = function()

in SmartCoolerScan/clientHelper.js [15:61]


exports.signHeaders = function (configArgs, options) {
    const headers = {};

    if ((options.headers !== null) && (options.headers !== undefined)) {
        Object.keys(options.headers).forEach(item => headers[item] = options.headers[item]);
    }

    headers['x-amz-pay-region'] = configArgs.region;
    headers['x-amz-pay-host'] =  constants.REGION_MAP[configArgs.region.toLowerCase()];
    headers['x-amz-pay-date'] = getTimestamp();
    headers['content-type'] =  'application/json';
    headers['accept'] = 'application/json';
    headers['user-agent'] = `amazon-pay-sdk-nodejs/${constants.VERSION} (JS/${process.versions.node}; ${process.platform})`;

    const lowercaseSortedHeaderKeys = Object.keys(headers).sort(function (a, b) {
        return a.toLowerCase().localeCompare(b.toLowerCase());
    });

    let signedHeaders = '';
    lowercaseSortedHeaderKeys.forEach(item => signedHeaders += item.toLowerCase() + ';');
    signedHeaders = signedHeaders.slice(0, -1); // remove trailing semicolon

    let payload = options.payload;
    if ((payload === null) || (payload === undefined) || (options.urlFragment.includes('/account-management/v1/accounts'))) {
        payload = ''; // do not sign payload for payment critical data APIs
    }

    let canonicalRequest = options.method + '\n/' + options.urlFragment + '\n\n';
    lowercaseSortedHeaderKeys.forEach(item => canonicalRequest += item.toLowerCase() + ':' + headers[item] + '\n');
    canonicalRequest += '\n' + signedHeaders + '\n' + crypto.createHash('SHA256').update(payload).digest('hex');
//    console.log('\nCANONICAL REQUEST (dashes added for clarity only):\n---\n' + canonicalRequest + '\n---\n');

    const stringToSign = constants.AMAZON_SIGNATURE_ALGORITHM + '\n' +
        crypto.createHash('SHA256').update(canonicalRequest).digest('hex');

//    console.log('STRING TO SIGN (dashes added for clarity only):\n---\n' + stringToSign + '\n---\n');

    const signature = sign(configArgs.privateKey, stringToSign);
//    console.log('BASE64 ENCODED SIGNATURE:\n' + signature + '\n');

    headers['authorization'] = constants.AMAZON_SIGNATURE_ALGORITHM
        + ' PublicKeyId=' + configArgs['publicKeyId']
        + ', SignedHeaders=' + signedHeaders
        + ', Signature=' + signature;

   return headers;
}