52 lines
1.7 KiB
TypeScript
52 lines
1.7 KiB
TypeScript
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;
|
|
};
|
|
}
|
|
}
|