jsonauthtoken 1.0.1 → 2.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,5 @@
1
+ declare function jat(): {
2
+ create: (keys: KeysType, headers?: HeaderForCreate, payloads?: any) => string;
3
+ verify: (encryptedToken: string, keys: KeysType) => HeaderAndPlayload;
4
+ };
5
+ export default jat;
package/dist/index.js ADDED
@@ -0,0 +1,68 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const encoading_lib_1 = __importDefault(require("./lib/encoading.lib"));
7
+ const decoading_lib_1 = __importDefault(require("./lib/decoading.lib"));
8
+ const signature_lib_1 = __importDefault(require("./lib/signature.lib"));
9
+ const encryption_lib_1 = __importDefault(require("./lib/encryption.lib"));
10
+ const decryption_lib_1 = __importDefault(require("./lib/decryption.lib"));
11
+ const functions_lib_1 = require("./lib/functions.lib");
12
+ const algorithms = ['sha256', 'sha384', 'sha512'];
13
+ function jat() {
14
+ const create = (keys, headers = {}, payloads = {}) => {
15
+ let { signKey, encKey } = keys;
16
+ if (!signKey)
17
+ throw new Error("please provide signkey");
18
+ if (!encKey)
19
+ throw new Error("please provide encKey");
20
+ let exp;
21
+ if (headers.expiresAt)
22
+ exp = (0, functions_lib_1.parseExpiration)(headers.expiresAt);
23
+ else
24
+ throw new Error("please provide token expire");
25
+ let algo = (0, functions_lib_1.algoMatching)(algorithms, 'sha512', headers.algorithm);
26
+ let header = (0, encoading_lib_1.default)({
27
+ token: 'JAT',
28
+ algorithm: algo,
29
+ createAt: Math.floor(Date.now() / 1000),
30
+ expiresAt: exp,
31
+ });
32
+ if (typeof (payloads) != 'object')
33
+ throw new Error("payload should be Object");
34
+ let payload = (0, encoading_lib_1.default)(payloads);
35
+ let sign = (0, signature_lib_1.default)().createSign(algo, signKey, header, payload);
36
+ let token = header + '.' + payload + '.' + sign;
37
+ let encryptedToken = (0, encryption_lib_1.default)(encKey, token);
38
+ return encryptedToken;
39
+ };
40
+ const verify = (encryptedToken, keys) => {
41
+ let token = '';
42
+ let header;
43
+ let payload = '';
44
+ let { signKey, encKey } = keys;
45
+ if (!signKey)
46
+ throw new Error("please provide signkey");
47
+ if (!encKey)
48
+ throw new Error("please provide encKey");
49
+ try {
50
+ token = (0, decryption_lib_1.default)(encryptedToken, encKey);
51
+ }
52
+ catch (error) {
53
+ throw new Error('unable to decrypt token');
54
+ }
55
+ const [encodedHeader, encodedPayload, sign] = token.split('.');
56
+ let isSignVerified = (0, signature_lib_1.default)().verifySign({ encodedHeader, encodedPayload, sign }, signKey);
57
+ if (isSignVerified === false) {
58
+ throw new Error('Invalid signature');
59
+ }
60
+ header = (0, decoading_lib_1.default)(encodedHeader);
61
+ if ((0, functions_lib_1.isExpired)(header.expiresAt))
62
+ throw new Error('token is expired');
63
+ payload = (0, decoading_lib_1.default)(encodedPayload);
64
+ return { header, payload };
65
+ };
66
+ return { create, verify };
67
+ }
68
+ exports.default = jat;
@@ -0,0 +1,2 @@
1
+ declare const decoading: (str: string) => any;
2
+ export default decoading;
@@ -0,0 +1,9 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const decoading = (str) => {
4
+ const base64 = str.replace(/-/g, '+').replace(/_/g, '/');
5
+ const padding = '='.repeat((4 - base64.length % 4) % 4);
6
+ const decoded = Buffer.from(base64 + padding, 'base64').toString('utf8');
7
+ return JSON.parse(decoded);
8
+ };
9
+ exports.default = decoading;
@@ -0,0 +1,2 @@
1
+ declare function decryption(encryptedToken: string, password: string): string;
2
+ export default decryption;
@@ -0,0 +1,17 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ function decryption(encryptedToken, password) {
8
+ const parts = encryptedToken.split(':');
9
+ const iv = Buffer.from(parts.shift(), 'hex');
10
+ const encryptedTokenBuffer = Buffer.from(parts.join(':'), 'hex');
11
+ const key = crypto_1.default.scryptSync(password, 'salt', 32);
12
+ const decipher = crypto_1.default.createDecipheriv('aes-256-cbc', key, iv);
13
+ let decrypted = decipher.update(encryptedTokenBuffer, null, 'utf8');
14
+ decrypted += decipher.final('utf8');
15
+ return decrypted;
16
+ }
17
+ exports.default = decryption;
@@ -0,0 +1,2 @@
1
+ declare function encoading(data: any): string;
2
+ export default encoading;
@@ -1,7 +1,8 @@
1
- function encoading(data) {
2
- const json = JSON.stringify(data);
3
- const base64 = Buffer.from(json).toString('base64');
4
- return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
5
- }
6
-
7
- export default encoading
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ function encoading(data) {
4
+ const json = JSON.stringify(data);
5
+ const base64 = Buffer.from(json).toString('base64');
6
+ return base64.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
7
+ }
8
+ exports.default = encoading;
@@ -0,0 +1,2 @@
1
+ declare function encryption(password: string, token: string): string;
2
+ export default encryption;
@@ -0,0 +1,15 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ function encryption(password, token) {
8
+ const iv = crypto_1.default.randomBytes(16);
9
+ const key = crypto_1.default.scryptSync(password, 'salt', 32);
10
+ const cipher = crypto_1.default.createCipheriv('aes-256-cbc', key, iv);
11
+ let encrypted = cipher.update(token, 'utf8', 'hex');
12
+ encrypted += cipher.final('hex');
13
+ return iv.toString('hex') + ':' + encrypted;
14
+ }
15
+ exports.default = encryption;
@@ -0,0 +1,4 @@
1
+ declare function algoMatching(algorithms: AlgorithmArray, defaultOutput: Algorithm | string, input: string): string;
2
+ declare function parseExpiration(input: string): number;
3
+ declare function isExpired(timeStamp: number): boolean;
4
+ export { algoMatching, parseExpiration, isExpired };
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.algoMatching = algoMatching;
4
+ exports.parseExpiration = parseExpiration;
5
+ exports.isExpired = isExpired;
6
+ function algoMatching(algorithms, defaultOutput, input) {
7
+ if (!defaultOutput)
8
+ throw new Error('defaultOutput parameter can not be empty');
9
+ let defaultAlgorithm = defaultOutput;
10
+ for (let i in algorithms) {
11
+ if (algorithms[i] === input)
12
+ defaultAlgorithm = algorithms[i];
13
+ }
14
+ return defaultAlgorithm.toString();
15
+ }
16
+ function parseExpiration(input) {
17
+ const regex = /^(\d+)([mhdMHDyY]|MIN)$/;
18
+ const match = input.match(regex);
19
+ if (!match) {
20
+ throw new Error('Invalid format. Use formats like 1M, 1Y, 1D, 1MIN.');
21
+ }
22
+ const amount = parseInt(match[1], 10);
23
+ const unit = match[2].toLowerCase();
24
+ let seconds;
25
+ switch (unit) {
26
+ case 'y':
27
+ seconds = amount * 365 * 24 * 60 * 60;
28
+ break;
29
+ case 'm':
30
+ seconds = amount * 30 * 24 * 60 * 60;
31
+ break;
32
+ case 'd':
33
+ seconds = amount * 24 * 60 * 60;
34
+ break;
35
+ case 'h':
36
+ seconds = amount * 60 * 60;
37
+ break;
38
+ case 'min':
39
+ seconds = amount * 60;
40
+ break;
41
+ default:
42
+ throw new Error('Unsupported time unit. Use M, Y, D, H, or MIN.');
43
+ }
44
+ return Math.floor(Date.now() / 1000) + seconds;
45
+ }
46
+ function isExpired(timeStamp) {
47
+ let currentTime = Math.floor(Date.now() / 1000);
48
+ if (timeStamp < currentTime) {
49
+ return true;
50
+ }
51
+ else {
52
+ return false;
53
+ }
54
+ }
@@ -0,0 +1,5 @@
1
+ declare const signature: () => {
2
+ createSign: (algorithm: string, key: string, header: string, payload: string) => string;
3
+ verifySign: (tokens: DecryptedTokenParts, key: string) => boolean;
4
+ };
5
+ export default signature;
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ const decoading_lib_1 = __importDefault(require("./decoading.lib"));
8
+ const signature = () => {
9
+ const createSign = (algorithm, key, header, payload) => {
10
+ const signature = crypto_1.default
11
+ .createHmac(algorithm, key)
12
+ .update(header + '.' + payload)
13
+ .digest('base64url');
14
+ return signature;
15
+ };
16
+ const verifySign = (tokens, key) => {
17
+ const header = (0, decoading_lib_1.default)(tokens.encodedHeader);
18
+ let newSign = createSign(header.algorithm, key, tokens.encodedHeader, tokens.encodedPayload);
19
+ if (newSign === tokens.sign)
20
+ return true;
21
+ else
22
+ return false;
23
+ };
24
+ return { createSign, verifySign };
25
+ };
26
+ exports.default = signature;
package/package.json CHANGED
@@ -1,18 +1,26 @@
1
1
  {
2
2
  "name": "jsonauthtoken",
3
- "version": "1.0.1",
4
- "description": "jsonauthtoken is a JavaScript library to secure authentication.",
5
- "main": "index.js",
6
- "type": "module",
3
+ "version": "2.0.0",
4
+ "description": "jsonauthtoken is a JavaScript/TypeScript library to secure authentication.",
5
+ "main": "dist/index.js",
7
6
  "repository": {
8
7
  "type": "git",
9
8
  "url": "https://github.com/iamAyanBiswas/jsonauthtoken"
10
9
  },
11
10
  "scripts": {
12
- "test": "node index.js"
11
+ "test": "node dist/index.js",
12
+ "start": "tsc && node dist/index.js"
13
13
  },
14
14
  "author": "Ayan Biswas",
15
15
  "license": "ISC",
16
+ "bugs": {
17
+ "url": "https://github.com/iamAyanBiswas/jsonauthtoken/issues"
18
+ },
19
+ "homepage": "https://github.com/iamAyanBiswas/jsonauthtoken#readme",
20
+ "devDependencies": {
21
+ "@types/node": "^22.9.0",
22
+ "typescript": "^5.6.3"
23
+ },
16
24
  "keywords": [
17
25
  "jat",
18
26
  "jwt",
@@ -24,4 +32,4 @@
24
32
  "sha384",
25
33
  "sha512"
26
34
  ]
27
- }
35
+ }
package/types.d.ts ADDED
@@ -0,0 +1,43 @@
1
+ declare global {
2
+ export type Algorithm = 'sha256' | 'sha384' | 'sha512';
3
+ export type AlgorithmArray = ['sha256', 'sha384', 'sha512']
4
+
5
+ //type for keys input
6
+ interface KeysType {
7
+ signKey: string;
8
+ encKey: string;
9
+ }
10
+
11
+ //type for header at create fn
12
+ interface HeaderForCreate {
13
+ expiresAt?: string;
14
+ algorithm?: Algorithm;
15
+ }
16
+
17
+ //type for header at create fn
18
+ interface HeaderForVerify {
19
+ expiresAt?: string;
20
+ algorithm?: Algorithm;
21
+ }
22
+
23
+ //
24
+ interface DecryptedTokenParts {
25
+ encodedHeader: string;
26
+ encodedPayload: string;
27
+ sign: string
28
+ }
29
+
30
+ interface TokenHeaders {
31
+ token: 'JAT';
32
+ algorithm: string;
33
+ createAt: number;
34
+ expiresAt: number;
35
+ }
36
+
37
+ interface HeaderAndPlayload{
38
+ header:TokenHeaders;
39
+ payload:any
40
+ }
41
+ }
42
+
43
+ export { };
package/index.js DELETED
@@ -1,84 +0,0 @@
1
- import encoading from './lib/encoading.lib.js'
2
- import decoading from './lib/decoading.lib.js'
3
- import signature from './lib/signature.lib.js'
4
- import encryption from './lib/encryption.lib.js'
5
- import decryption from './lib/decryption.lib.js'
6
- import { algoMatching, parseExpiration, isExpired } from './lib/functions.lib.js'
7
-
8
- function jat() {
9
-
10
-
11
- const algorithms = ['sha256', 'sha384', 'sha512']
12
-
13
- /////////////////////--------------- create token ---------------------/////////////////////////
14
- const create = (keys, headers = {}, payloads = {}) => {
15
-
16
- let {signKey, encKey} = keys
17
- if(!signKey) throw new Error("please provide signkey");
18
- if(!encKey) throw new Error("please provide encKey");
19
-
20
-
21
- let exp = ''
22
- if (headers.expiresAt) exp = parseExpiration(headers.expiresAt)
23
- else throw new Error("please provide token expire")
24
-
25
- let algo = algoMatching(algorithms, 'sha512', headers.algo)
26
-
27
- let header = encoading({
28
- token: 'JAT',
29
- algorithm: algo,
30
- createAt: Math.floor(Date.now() / 1000),
31
- expiresAt: exp,
32
- })
33
-
34
- if (typeof (payloads) != 'object') throw new Error("payload should be Object");
35
- let payload = encoading(payloads)
36
-
37
- let sign = signature().createSign(algo, signKey, header, payload)
38
-
39
- let token = header + '.' + payload + '.' + sign
40
- let encryptedToken = encryption(encKey, token)
41
- return encryptedToken
42
- }
43
-
44
-
45
- /////////////////////--------------- verify token ---------------------/////////////////////////
46
- const verify = (encryptedToken, keys) => {
47
- let token = ''
48
- let header = ''
49
- let payload = ''
50
-
51
- let {signKey, encKey} = keys
52
- if(!signKey) throw new Error("please provide signkey");
53
- if(!encKey) throw new Error("please provide encKey");
54
-
55
- //decrypt token
56
- try {
57
- token = decryption(encryptedToken, encKey)
58
- } catch (error) {
59
- throw new Error('unable to decrypt token')
60
- }
61
-
62
- //verify token signature
63
- let isSignVerified = signature().verifySign(token, signKey)
64
- if (isSignVerified === false) {
65
- throw new Error('Invalid signature')
66
- }
67
-
68
- //
69
- const [encodedHeader, encodedPayload, sign] = token.split('.');
70
-
71
- header = decoading(encodedHeader)
72
- if(isExpired(header.expiresAt)) throw new Error('token is expired')
73
-
74
- payload = decoading(encodedPayload)
75
-
76
- return {header,payload}
77
- }
78
- return { create, verify }
79
- }
80
-
81
-
82
-
83
-
84
- export default jat
@@ -1,14 +0,0 @@
1
- const decoading = (str) => {
2
- // Replace URL-safe characters with standard Base64 characters
3
- const base64 = str.replace(/-/g, '+').replace(/_/g, '/');
4
-
5
- // Add padding if necessary
6
- const padding = '='.repeat((4 - base64.length % 4) % 4);
7
-
8
- // Decode the Base64 string
9
- const decoded = Buffer.from(base64 + padding, 'base64').toString('utf8');
10
-
11
- return JSON.parse(decoded);
12
- };
13
-
14
- export default decoading
@@ -1,18 +0,0 @@
1
- import exp from 'constants';
2
- import crypto from 'crypto'
3
-
4
- function decryption(encryptedToken, password) {
5
- const parts = encryptedToken.split(':');
6
- const iv = Buffer.from(parts.shift(), 'hex'); // Get the IV
7
- const encryptedTokenBuffer = Buffer.from(parts.join(':'), 'hex');
8
- const key = crypto.scryptSync(password, 'salt', 32);
9
-
10
- const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv);
11
-
12
- let decrypted = decipher.update(encryptedTokenBuffer, 'binary', 'utf8');
13
- decrypted += decipher.final('utf8');
14
-
15
- return decrypted;
16
-
17
- }
18
- export default decryption
@@ -1,15 +0,0 @@
1
- import crypto from 'crypto'
2
-
3
- function encryption(password,token){
4
- const iv = crypto.randomBytes(16); // Initialization vector
5
- const key = crypto.scryptSync(password, 'salt', 32); // Key derivation
6
- const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
7
-
8
- let encrypted = cipher.update(token, 'utf8', 'hex');
9
- encrypted += cipher.final('hex');
10
-
11
- // Return the IV and encrypted text
12
- return iv.toString('hex') + ':' + encrypted;
13
- }
14
-
15
- export default encryption
@@ -1,66 +0,0 @@
1
- function algoMatching(algorithms, defaultOutput, input) {
2
-
3
- //check defaultOutput parameter
4
- if (!defaultOutput) throw new Error('defaultOutput parameter can not be empty')
5
-
6
- //find the correct algorithm name is given as 'input' or not , if is't return defaultOutput
7
- for (let i in algorithms) {
8
- if (String(algorithms[i]) === String(input)) defaultOutput = algorithms[i]
9
- }
10
-
11
- return defaultOutput
12
- }
13
-
14
-
15
- function parseExpiration(input) {
16
- const regex = /^(\d+)([mhdMHDyY]|MIN)$/; // Regex to match number + unit
17
- const match = input.match(regex);
18
-
19
- if (!match) {
20
- throw new Error('Invalid format. Use formats like 1M, 1Y, 1D, 1MIN.');
21
- }
22
-
23
- const amount = parseInt(match[1], 10);
24
- const unit = match[2].toLowerCase(); // Normalize to lowercase
25
-
26
- let seconds;
27
-
28
- switch (unit) {
29
- case 'y':
30
- seconds = amount * 365 * 24 * 60 * 60; // Years to seconds
31
- break;
32
- case 'm':
33
- seconds = amount * 30 * 24 * 60 * 60; // Months to seconds (approximation)
34
- break;
35
- case 'd':
36
- seconds = amount * 24 * 60 * 60; // Days to seconds
37
- break;
38
- case 'h':
39
- seconds = amount * 60 * 60; // Hours to seconds
40
- break;
41
- case 'min':
42
- seconds = amount * 60; // Minutes to seconds
43
- break;
44
- default:
45
- throw new Error('Unsupported time unit. Use M, Y, D, H, or MIN.');
46
- }
47
-
48
-
49
- return Math.floor(Date.now() / 1000) + seconds; // Current time + expiration time
50
- }
51
-
52
-
53
- function isExpired(timeStamp) {
54
- let currentTime = Math.floor(Date.now() / 1000)
55
- if (timeStamp < currentTime) {
56
- return true
57
- }
58
- else {
59
- return false
60
- }
61
- }
62
-
63
-
64
-
65
-
66
- export { algoMatching, parseExpiration, isExpired }
@@ -1,26 +0,0 @@
1
- import crypto from 'crypto'
2
- import decoading from './decoading.lib.js';
3
-
4
- const signature = () => {
5
-
6
- const createSign = (algorithm, key, header, payload) => {
7
- const signature = crypto
8
- .createHmac(algorithm, key)
9
- .update(header + '.' + payload)
10
- .digest('base64url');
11
- return signature
12
- }
13
-
14
- const verifySign = (token,key) => {
15
- const [encodedHeader, encodedPayload, signature] = token.split('.');
16
- const header= decoading(encodedHeader)
17
-
18
- let newSign=createSign(header.algorithm, key, encodedHeader, encodedPayload)
19
-
20
- if(newSign == signature) return true
21
- else return false
22
- }
23
- return { createSign, verifySign }
24
- }
25
-
26
- export default signature