ff-admin-server/src/helpers/jwtHelper.ts

113 lines
3.9 KiB
TypeScript
Raw Normal View History

import jwt from "jsonwebtoken";
2024-11-23 12:11:19 +01:00
import { JWTData, JWTToken } from "../type/jwtTypes";
import { JWT_SECRET, JWT_EXPIRATION } from "../env.defaults";
2024-11-23 12:11:19 +01:00
import InternalException from "../exceptions/internalException";
2025-02-15 10:59:54 +01:00
import RolePermissionService from "../service/management/rolePermissionService";
import UserPermissionService from "../service/management/userPermissionService";
import UserService from "../service/management/userService";
2024-11-23 12:11:19 +01:00
import PermissionHelper from "./permissionHelper";
2025-02-15 10:59:54 +01:00
import WebapiService from "../service/management/webapiService";
import WebapiPermissionService from "../service/management/webapiPermissionService";
2025-01-22 11:57:19 +01:00
import ms from "ms";
export abstract class JWTHelper {
static validate(token: string): Promise<string | jwt.JwtPayload> {
return new Promise<string | jwt.JwtPayload>((resolve, reject) => {
jwt.verify(token, JWT_SECRET, (err, decoded) => {
if (err) reject(err.message);
else resolve(decoded);
});
});
}
2025-01-22 11:57:19 +01:00
static create(
data: JWTData,
{ expOverwrite, useExpiration }: { expOverwrite?: number; useExpiration?: boolean } = { useExpiration: true }
): Promise<string> {
return new Promise<string>((resolve, reject) => {
jwt.sign(
data,
JWT_SECRET,
{
2025-01-22 11:57:19 +01:00
...(useExpiration ?? true ? { expiresIn: expOverwrite ?? JWT_EXPIRATION } : {}),
},
(err, token) => {
if (err) reject(err.message);
else resolve(token);
}
);
});
}
static decode(token: string): Promise<string | jwt.JwtPayload> {
return new Promise<string | jwt.JwtPayload>((resolve, reject) => {
try {
let decoded = jwt.decode(token);
resolve(decoded);
} catch (err) {
reject(err.message);
}
});
}
2024-11-23 12:11:19 +01:00
2025-01-29 08:53:49 +01:00
static async buildToken(id: string): Promise<string> {
2024-11-23 12:11:19 +01:00
let { firstname, lastname, mail, username, isOwner } = await UserService.getById(id);
let userPermissions = await UserPermissionService.getByUser(id);
let userPermissionStrings = userPermissions.map((e) => e.permission);
let userRoles = await UserService.getAssignedRolesByUserId(id);
let rolePermissions =
userRoles.length != 0 ? await RolePermissionService.getByRoles(userRoles.map((e) => e.id)) : [];
let rolePermissionStrings = rolePermissions.map((e) => e.permission);
let permissionObject = PermissionHelper.convertToObject([...userPermissionStrings, ...rolePermissionStrings]);
let jwtData: JWTToken = {
userId: id,
mail: mail,
username: username,
firstname: firstname,
lastname: lastname,
isOwner: isOwner,
permissions: permissionObject,
};
return await JWTHelper.create(jwtData)
.then((result) => {
return result;
})
.catch((err) => {
throw new InternalException("Failed accessToken creation", err);
});
}
2025-01-21 13:54:52 +01:00
2025-01-22 11:57:19 +01:00
static async buildWebapiToken(token: string, expiration?: Date): Promise<string> {
2025-01-22 09:39:31 +01:00
let { id, title } = await WebapiService.getByToken(token);
let webapiPermissions = await WebapiPermissionService.getByApi(id);
let webapiPermissionStrings = webapiPermissions.map((e) => e.permission);
let permissionObject = PermissionHelper.convertToObject(webapiPermissionStrings);
2025-01-21 13:54:52 +01:00
let jwtData: JWTToken = {
2025-01-29 08:53:49 +01:00
userId: id.toString(),
2025-01-21 13:54:52 +01:00
mail: "",
username: title,
firstname: "",
lastname: "",
isOwner: false,
permissions: permissionObject,
2025-01-22 09:27:15 +01:00
sub: "webapi_access_token",
2025-01-21 13:54:52 +01:00
};
2025-01-22 11:57:19 +01:00
let overwriteExpiration =
ms(JWT_EXPIRATION) < new Date().getTime() - new Date(expiration).getTime()
? null
: Date.now() - new Date(expiration).getTime();
return await JWTHelper.create(jwtData, { expOverwrite: overwriteExpiration, useExpiration: true })
2025-01-21 13:54:52 +01:00
.then((result) => {
return result;
})
.catch((err) => {
2025-01-22 09:39:31 +01:00
throw new InternalException("Failed webapi accessToken creation", err);
2025-01-21 13:54:52 +01:00
});
}
}