UNPKG

pcp-server-nodejs-sdk

Version:

[![Quality Gate Status](https://sonarcloud.io/api/project_badges/measure?project=PAYONE-GmbH_PCP-server-nodeJS-SDK&metric=alert_status)](https://sonarcloud.io/summary/new_code?id=PAYONE-GmbH_PCP-server-nodeJS-SDK) [![Coverage](https://sonarcloud.io/api/pr

75 lines 3.91 kB
import * as crypto from 'crypto'; import { Headers } from 'node-fetch'; import { URL } from 'url'; import { CommunicatorConfiguration } from './CommunicatorConfiguration.js'; import { ServerMetaInfo } from './utils/ServerMetaInfo.js'; export class RequestHeaderGenerator { constructor(config) { 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