import { FastifyInstance } from "fastify"; import fp from "fastify-plugin"; import { secrets } from "../utils/secrets"; /** * Fastify Plugin für Machine-to-Machine Authentifizierung. * * Dieses Plugin prüft, ob der Header `x-api-key` vorhanden ist * und mit dem in der .env hinterlegten M2M_API_KEY übereinstimmt. * * Verwendung: * server.register(m2mAuthPlugin, { allowedPrefix: '/internal' }) */ export default fp(async (server: FastifyInstance, opts: { allowedPrefix?: string } = {}) => { //const allowedPrefix = opts.allowedPrefix || "/internal"; server.addHook("preHandler", async (req, reply) => { try { // Nur prüfen, wenn Route unterhalb des Prefix liegt //if (!req.url.startsWith(allowedPrefix)) return; const apiKey = req.headers["x-api-key"]; if (!apiKey || apiKey !== secrets.M2M_API_KEY) { server.log.warn(`[M2M Auth] Ungültiger oder fehlender API-Key bei ${req.url}`); return reply.status(401).send({ error: "Unauthorized" }); } // Zusatzinformationen im Request (z. B. interne Kennung) (req as any).m2m = { verified: true, type: "internal", key: apiKey, }; } catch (err) { // @ts-ignore server.log.error("[M2M Auth] Fehler beim Prüfen des API-Keys:", err); return reply.status(500).send({ error: "Internal Server Error" }); } }); }); declare module "fastify" { interface FastifyRequest { m2m?: { verified: boolean; type: "internal"; key: string; }; } }