nest-paapi-5
Version:
A NestJS module for Amazon's Product Advertising API 5.0 (PAAPI5)
116 lines • 5.19 kB
JavaScript
;
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
return c > 3 && r && Object.defineProperty(target, key, r), r;
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.SignService = void 0;
const crypto_js_1 = __importDefault(require("crypto-js"));
const common_1 = require("@nestjs/common");
let SignService = class SignService {
sign({ accessKey, secretKey, headers, method, path, payload, region, service = "ProductAdvertisingAPI", timestamp, }) {
const authorizationHeader = this.createAuthorizationHeader(accessKey, secretKey, headers, method, path, payload, region, service, timestamp);
return authorizationHeader;
}
createAuthorizationHeader(accessKey, secretKey, headers, method, path, payload, region, service, timestamp) {
// Step 1: Create Signed Headers
const signedHeaders = this.createSignedHeaders(headers);
// Step 2: Create Canonical Request
const canonicalRequest = this.createCanonicalRequest(method, path, {}, headers, payload);
// Step 3: Create String To Sign
const stringToSign = this.createStringToSign(timestamp, region, service, canonicalRequest);
// Step 4: Create Signature Headers
const signature = this.createSignature(secretKey, timestamp, region, service, stringToSign);
// Step 5: Create Authorization Header
const authorizationHeader = this.createAuthorizationHeaders(timestamp, accessKey, region, service, signedHeaders, signature);
return authorizationHeader;
}
createAuthorizationHeaders(timestamp, accessKey, region, service, signedHeaders, signature) {
return ("AWS4-HMAC-SHA256" +
" " +
"Credential=" +
accessKey +
"/" +
this.createCredentialScope(timestamp, region, service) +
", " +
"SignedHeaders=" +
signedHeaders +
", " +
"Signature=" +
signature);
}
createCanonicalRequest(method, pathname, query, headers, payload) {
const payloadJson = JSON.stringify(payload);
return [
method.toUpperCase(),
pathname,
this.createCanonicalQueryString(query),
this.createCanonicalHeaders(headers),
this.createSignedHeaders(headers),
this.hexEncodedHash(payloadJson || ""),
].join("\n");
}
createCanonicalQueryString(params) {
return Object.keys(params)
.sort()
.map((key) => `${encodeURIComponent(key)}=${encodeURIComponent(params[key])}`)
.join("&");
}
createCanonicalHeaders(headers) {
return Object.keys(headers)
.sort()
.map((name) => `${name.toLowerCase().trim()}:${headers[name].toString().trim()}\n`)
.join("");
}
createSignedHeaders(headers) {
return Object.keys(headers)
.sort()
.map((name) => name.toLowerCase().trim())
.join(";");
}
createCredentialScope(time, region, service) {
return [this.toDate(time), region, service, "aws4_request"].join("/");
}
createStringToSign(time, region, service, request) {
return [
"AWS4-HMAC-SHA256",
this.toTime(time),
this.createCredentialScope(time, region, service),
this.hexEncodedHash(request),
].join("\n");
}
createSignature(secret, time, region, service, stringToSign) {
const dateKey = this.hmac(`AWS4${secret}`, this.toDate(time));
const regionKey = this.hmac(dateKey, region);
const serviceKey = this.hmac(regionKey, service);
const signingKey = this.hmac(serviceKey, "aws4_request");
return this.hmac(signingKey, stringToSign).toString();
}
toAmzDate(time) {
// eslint-disable-next-line no-useless-escape
return new Date(time).toISOString().replace(/[:\-]|\.\d{3}/g, "");
}
toTime(time) {
// eslint-disable-next-line no-useless-escape
return new Date(time).toISOString().replace(/[:\-]|\.\d{3}/g, "");
}
toDate(time) {
return this.toTime(time).substring(0, 8);
}
hmac(key, data) {
return crypto_js_1.default.HmacSHA256(data, key);
}
hexEncodedHash(data) {
return crypto_js_1.default.SHA256(data).toString(crypto_js_1.default.enc.Hex);
}
};
exports.SignService = SignService;
exports.SignService = SignService = __decorate([
(0, common_1.Injectable)()
], SignService);
//# sourceMappingURL=sign.service.js.map