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);
+}
|