From f7567d157914b94dcc0f9f059a04565a80a100e3 Mon Sep 17 00:00:00 2001 From: Desmond Hiew Date: Fri, 12 May 2023 15:52:37 +0900 Subject: [PATCH] Fix signature. Added function to replace special character on json body --- src/signature.ts | 82 +++++++++++++++++++++++++++--------------------- 1 file changed, 47 insertions(+), 35 deletions(-) diff --git a/src/signature.ts b/src/signature.ts index 66b6ee2..e795e3e 100644 --- a/src/signature.ts +++ b/src/signature.ts @@ -1,45 +1,57 @@ import crypto = require('crypto'); export function sortObject(obj: any): any { - const sortedObj: any = {}; - Object.keys(obj).sort().forEach((key): void => { - if(Array.isArray(obj[key])) { - sortedObj[key] = obj[key] - } else if(typeof obj[key] === 'object') { - sortedObj[key] = sortObject(obj[key]); - } else { - sortedObj[key] = obj[key]; - } + const sortedObj: any = {}; + Object.keys(obj) + .sort() + .forEach((key): void => { + if (Array.isArray(obj[key])) { + sortedObj[key] = obj[key]; + } else if (typeof obj[key] === 'object') { + sortedObj[key] = sortObject(obj[key]); + } else { + sortedObj[key] = obj[key]; + } }); - return sortedObj; + return sortedObj; } -export function generateSignature(arg: { - data: any, - requestUrl: string, - nonceStr: string, - signType: string, - method: string, - timestamp: string, -}, privateKey: string): string { +const replaceSpecialCharacters = (str: string) => { + return str + .replace(//g, '\\u003e') + .replace(/&/g, '\\u0026'); +}; - let signature_data = '' +export function generateSignature( + arg: { + data: any; + requestUrl: string; + nonceStr: string; + signType: string; + method: string; + timestamp: string; + }, + privateKey: string +): string { + let signature_data = ''; - if (arg.data !== null && typeof arg.data === 'object') { - const signature_body = sortObject(arg.data) - const signature = Buffer.from(JSON.stringify(signature_body)).toString('base64') - signature_data = 'data=' + signature + '&' - } + if (arg.data !== null && typeof arg.data === 'object') { + const signature_body = sortObject(arg.data); + const jsonValue = replaceSpecialCharacters(JSON.stringify(signature_body)); + const signature = Buffer.from(jsonValue).toString('base64'); + signature_data = 'data=' + signature + '&'; + } - const full_signature = signature_data - + 'method=' + arg.method - + '&nonceStr=' + arg.nonceStr - + '&requestUrl=' + arg.requestUrl - + '&signType=' + arg.signType - + '×tamp=' + arg.timestamp + const full_signature = signature_data + + 'method=' + arg.method + + '&nonceStr=' + arg.nonceStr + + '&requestUrl=' + arg.requestUrl + + '&signType=' + arg.signType + + '×tamp=' + arg.timestamp - return crypto - .createSign('SHA256') - .update(full_signature) - .sign(privateKey, 'base64') -} \ No newline at end of file + return crypto + .createSign('SHA256') + .update(full_signature) + .sign(privateKey, 'base64'); +}