Files
Checkmate/server/src/middleware/verifyJWT.ts
T
2026-01-20 23:07:31 +00:00

53 lines
1.5 KiB
TypeScript

import { NextFunction, Request, Response } from "express";
import jwt from "jsonwebtoken";
import { AppError } from "@/utils/AppError.js";
import { Settings } from "@/types/settings.js";
const SERVICE_NAME = "verifyJWT";
const TOKEN_PREFIX = "Bearer ";
export const createVerifyJWT = (settingsService: { getSettings: () => Settings }) => {
return (req: Request, res: Response, next: NextFunction) => {
const token = req.headers["authorization"];
// Make sure a token is provided
if (!token) {
const error = new AppError({ message: "No token provided", status: 401, service: SERVICE_NAME });
next(error);
return;
}
// Make sure it is properly formatted
if (!token.startsWith(TOKEN_PREFIX)) {
const error = new AppError({ message: "Invalid token format", status: 401, service: SERVICE_NAME, method: "verifyJWT" });
next(error);
return;
}
const parsedToken = token.slice(TOKEN_PREFIX.length, token.length);
// Verify the token's authenticity
const { jwtSecret } = settingsService.getSettings();
if (!jwtSecret) {
const error = new AppError({ message: "JWT secret not configured", status: 500, service: SERVICE_NAME });
next(error);
return;
}
jwt.verify(parsedToken, jwtSecret, (err: any, decoded: any) => {
if (err) {
const error = new AppError({
message: "Failed to authenticate token",
details: err,
status: 401,
service: SERVICE_NAME,
method: "verifyJWT",
});
next(error);
return;
} else {
// Token is valid, carry on
req.user = decoded;
next();
}
});
};
};