ebay-api
Version:
eBay API for Node and Browser
113 lines (112 loc) • 4.86 kB
JavaScript
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateSignature = exports.generateSignatureInput = exports.generateBaseString = exports.generateContentDigestValue = void 0;
const crypto_1 = require("crypto");
const beginPrivateKey = '-----BEGIN PRIVATE KEY-----';
const endPrivateKey = '-----END PRIVATE KEY-----';
// based on https://github.com/ebay/digital-signature-nodejs-sdk
/**
* Returns the current UNIX timestamp.
*
* @returns {number} The unix timestamp.
*/
const getUnixTimestamp = () => Date.now() / 1000 | 0;
const getSignatureParams = (payload) => [
...payload ? ['content-digest'] : [],
'x-ebay-signature-key',
'@method',
'@path',
'@authority'
];
const getSignatureParamsValue = (payload) => getSignatureParams(payload).map(param => `"${param}"`).join(' ');
/**
* Generates the 'Content-Digest' header value for the input payload.
*
* @param {any} payload The request payload.
* @param {string} cipher The algorithm used to calculate the digest.
* @returns {string} contentDigest The 'Content-Digest' header value.
*/
const generateContentDigestValue = (payload, cipher = 'sha256') => {
const payloadBuffer = Buffer.from(typeof payload === 'string' ? payload : JSON.stringify(payload));
const hash = (0, crypto_1.createHash)(cipher).update(payloadBuffer).digest('base64');
const algo = cipher === 'sha512' ? 'sha-512' : 'sha-256';
return `${algo}=:${hash}:`;
};
exports.generateContentDigestValue = generateContentDigestValue;
/**
* Generates the base string.
*
* @param {any} headers The HTTP request headers.
* @param {SignatureComponents} signatureComponents The config.
* @param {any} payload The payload.
* @param {number} timestamp The timestamp.
* @returns {string} payload The base string.
*/
function generateBaseString(headers, signatureComponents, payload, timestamp = getUnixTimestamp()) {
try {
let baseString = '';
const signatureParams = getSignatureParams(payload);
signatureParams.forEach(param => {
baseString += `"${param.toLowerCase()}": `;
if (param.startsWith('@')) {
switch (param.toLowerCase()) {
case '@method':
baseString += signatureComponents.method;
break;
case '@authority':
baseString += signatureComponents.authority;
break;
case '@path':
baseString += signatureComponents.path;
break;
default:
throw new Error('Unknown pseudo header ' + param);
}
}
else {
if (!headers[param]) {
throw new Error('Header ' + param + ' not included in message');
}
baseString += headers[param];
}
baseString += '\n';
});
baseString += `"@signature-params": (${getSignatureParamsValue(payload)});created=${timestamp}`;
return baseString;
}
catch (ex) {
throw new Error(`Error calculating signature base: ${ex.message}`);
}
}
exports.generateBaseString = generateBaseString;
/**
* Generates the Signature-Input header value for the input payload.
*
* @param {any} payload The input config.
* @param {number} timestamp The timestamp.
* @returns {string} the 'Signature-Input' header value.
*/
const generateSignatureInput = (payload, timestamp = getUnixTimestamp()) => `sig1=(${getSignatureParamsValue(payload)});created=${timestamp}`;
exports.generateSignatureInput = generateSignatureInput;
/**
* Generates the 'Signature' header.
*
* @param {any} headers The HTTP headers.
* @param {string} privateKey The HTTP headers.
* @param {SignatureComponents} signatureComponents The signature components
* @param {any} payload The payload
* @param {number} timestamp The payload
* @returns {string} the signature header value.
*/
function generateSignature(headers, privateKey, signatureComponents, payload, timestamp = getUnixTimestamp()) {
const baseString = generateBaseString(headers, signatureComponents, payload, timestamp);
privateKey = privateKey.trim();
if (!privateKey.startsWith(beginPrivateKey)) {
privateKey = beginPrivateKey + '\n' + privateKey + '\n' + endPrivateKey;
}
const signatureBuffer = (0, crypto_1.sign)(undefined, // If algorithm is undefined, then it is dependent upon the private key type.
Buffer.from(baseString), privateKey);
const signature = signatureBuffer.toString('base64');
return `sig1=:${signature}:`;
}
exports.generateSignature = generateSignature;
;