summary refs log tree commit diff
path: root/src/util/jwtUtils.js
diff options
context:
space:
mode:
Diffstat (limited to 'src/util/jwtUtils.js')
-rw-r--r--src/util/jwtUtils.js79
1 files changed, 49 insertions, 30 deletions
diff --git a/src/util/jwtUtils.js b/src/util/jwtUtils.js

index 9031631..ad97666 100644 --- a/src/util/jwtUtils.js +++ b/src/util/jwtUtils.js
@@ -1,14 +1,25 @@ -import {existsSync} from 'fs'; -import {readFile, writeFile} from "node:fs/promises"; -import {generateKeyPairSync, createHash, createPublicKey, createPrivateKey} from 'node:crypto'; -import jwt from "jsonwebtoken"; +import { existsSync } from 'fs'; +import { readFile, writeFile } from 'node:fs/promises'; +import { + generateKeyPairSync, + createHash, + createPublicKey, + createPrivateKey +} from 'node:crypto'; +import jwt from 'jsonwebtoken'; let privateKey, publicKey, fingerprint; +/** + * + * @returns {Promise<JwtData>} + */ export async function initJwt() { const secretPath = process.env.JWT_SECRET_PATH; if (!secretPath || !existsSync(secretPath)) { - throw new Error('JWT secret path is not defined in environment variables, or the directory does not exist.'); + throw new Error( + 'JWT secret path is not defined in environment variables, or the directory does not exist.' + ); } console.log(`[JWT] Initializing JWT with secret path: ${secretPath}`); @@ -17,9 +28,9 @@ export async function initJwt() { const publicKeyPath = `${secretPath}/jwt.key.pub`; if (!existsSync(privateKeyPath)) { - console.log("[JWT] Generating new keypair"); - const keyPair = generateKeyPairSync("ec", { - namedCurve: "secp521r1", + console.log('[JWT] Generating new keypair'); + const keyPair = generateKeyPairSync('ec', { + namedCurve: 'secp521r1' }); privateKey = keyPair.privateKey; @@ -28,16 +39,16 @@ export async function initJwt() { await Promise.all([ writeFile( privateKeyPath, - privateKey.export({format: "pem", type: "sec1"}), + privateKey.export({ format: 'pem', type: 'sec1' }) ), writeFile( publicKeyPath, - publicKey.export({format: "pem", type: "spki"}), - ), + publicKey.export({ format: 'pem', type: 'spki' }) + ) ]); - console.log("[JWT] Keypair generated successfully."); + console.log('[JWT] Keypair generated successfully.'); } else { - console.log("[JWT] Using existing keypair"); + console.log('[JWT] Using existing keypair'); const loadedPrivateKey = await readFile(privateKeyPath, 'utf8'); const loadedPublicKey = await readFile(publicKeyPath, 'utf8'); @@ -45,32 +56,32 @@ export async function initJwt() { publicKey = createPublicKey(loadedPublicKey); } - fingerprint = createHash("sha256") - .update(publicKey.export({format: "pem", type: "spki"})) - .digest("hex"); + fingerprint = createHash('sha256') + .update(publicKey.export({ format: 'pem', type: 'spki' })) + .digest('hex'); } /** * @type {import('jsonwebtoken').JwtOptions} */ const jwtOptions = { - algorithm: 'ES512', -} + algorithm: 'ES512' +}; -export async function generateJwtToken(user) { +/** + * + * @param data {JwtData} + * @returns {Promise<unknown>} + */ +export async function generateJwtToken(data) { if (!privateKey) { - throw new Error('JWT private key is not initialized. Please call initJwt() first.'); + throw new Error( + 'JWT private key is not initialized. Please call initJwt() first.' + ); } - const payload = { - sub: user._id.toString(), - username: user.username, - type: user.type, - iat: Math.floor(Date.now() / 1000) - }; - return new Promise((resolve, reject) => { - jwt.sign(payload, privateKey, jwtOptions, (err, token) => { + jwt.sign(data, privateKey, jwtOptions, (err, token) => { if (err) { console.error('[JWT] Error generating token:', err); return reject(err); @@ -82,7 +93,9 @@ export async function generateJwtToken(user) { export async function validateJwtToken(token) { if (!publicKey) { - throw new Error('JWT public key is not initialized. Please call initJwt() first.'); + throw new Error( + 'JWT public key is not initialized. Please call initJwt() first.' + ); } return new Promise((resolve, reject) => { @@ -94,4 +107,10 @@ export async function validateJwtToken(token) { resolve(decoded); }); }); -} \ No newline at end of file +} + +export class JwtData { + sub; + type; + iat = Math.floor(Date.now() / 1000); +}