pcp-server-nodejs-sdk
Version:
[](https://sonarcloud.io/summary/new_code?id=PAYONE-GmbH_PCP-server-nodeJS-SDK) [ {
this.config = config;
}
generateAdditionalRequestHeaders(url, request) {
const headers = new Headers(request.headers);
if (!headers.has(RequestHeaderGenerator.DATE_HEADER_NAME)) {
headers.set(RequestHeaderGenerator.DATE_HEADER_NAME, new Date().toUTCString());
}
if (!headers.has(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME)) {
headers.set(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME, this.getServerMetaInfo());
}
if (!headers.has(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME)) {
headers.set(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME, this.getClientMetaInfo());
}
if (!headers.has(RequestHeaderGenerator.AUTHORIZATION_HEADER_NAME)) {
headers.set(RequestHeaderGenerator.AUTHORIZATION_HEADER_NAME, this.getAuthHeader(url, request, headers));
}
return Object.assign(Object.assign({}, request), { headers });
}
getAuthHeader(url, request, headers) {
// 1. method
let stringToSign = `${request.method}\n`;
// 2. Content-Type
if (headers.has(RequestHeaderGenerator.CONTENT_TYPE_HEADER_NAME)) {
stringToSign += `${headers.get(RequestHeaderGenerator.CONTENT_TYPE_HEADER_NAME)}`;
}
stringToSign += '\n';
// 3. Date
stringToSign += `${headers.get(RequestHeaderGenerator.DATE_HEADER_NAME)}\n`;
// 4. Canonicalized Headers (starting with X-GCS, sorted by names)
if (headers.has(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME)) {
stringToSign += `${RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME.toLowerCase()}:${headers.get(RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME).replace(RequestHeaderGenerator.WHITESPACE_REGEX, ' ').trim()}\n`;
}
if (headers.has(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME)) {
stringToSign += `${RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME.toLowerCase()}:${headers.get(RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME).replace(RequestHeaderGenerator.WHITESPACE_REGEX, ' ').trim()}\n`;
}
// 5. Canonicalized Resource (has to include query parameters)
const urlInternal = new URL(url);
stringToSign += urlInternal.pathname;
if (urlInternal.search) {
stringToSign += `${urlInternal.search}`;
}
stringToSign += '\n';
const signature = this.sign(stringToSign);
return `GCS v1HMAC:${this.config.getApiKey()}:${signature}`;
}
sign(target) {
const hmac = crypto.createHmac(RequestHeaderGenerator.ALGORITHM, this.config.getApiSecret());
const hash = hmac.update(target).digest();
return hash.toString('base64');
}
getServerMetaInfo() {
const meta = new ServerMetaInfo();
const jsonString = JSON.stringify(meta);
return Buffer.from(jsonString, 'utf-8').toString('base64');
}
getClientMetaInfo() {
const encodedBytes = Buffer.from('"[]"', 'utf-8').toString('base64');
return encodedBytes;
}
}
RequestHeaderGenerator.SERVER_META_INFO_HEADER_NAME = 'X-GCS-ServerMetaInfo';
RequestHeaderGenerator.CLIENT_META_INFO_HEADER_NAME = 'X-GCS-ClientMetaInfo';
RequestHeaderGenerator.AUTHORIZATION_HEADER_NAME = 'Authorization';
RequestHeaderGenerator.DATE_HEADER_NAME = 'Date';
RequestHeaderGenerator.CONTENT_TYPE_HEADER_NAME = 'Content-Type';
RequestHeaderGenerator.ALGORITHM = 'sha256';
RequestHeaderGenerator.WHITESPACE_REGEX = /\r?\n[h]*/g;
//# sourceMappingURL=RequestHeaderGenerator.js.map