// Imports import { Router } from "express"; import bearerTokenMiddleware from "express-bearer-token"; import { ERR, VERB } from "../../util/logging.js"; // Constants const { MCL_CAIRO_URL } = process.env; const cairoAuthMiddleware = Router(); const cairoAuthenticate = async (token) => { const config = { headers: { Authorization: `Bearer ${token}` } }; return fetch(`${MCL_CAIRO_URL}/api/user/info`, config).then(async (res) => { if (res.status >= 300) { const errorMessage = await res .json() .then((data) => JSON.stringify(data)) .catch(() => res.statusText); throw Error( `Could not authenticate with user, receieved message: ${errorMessage}`, ); } return res.json(); }); }; // Middleware const cairoAuthHandler = (req, res, next) => { if (!req.token) return res.status(401).send("Cairo auth required!"); cairoAuthenticate(req.token) .then((authData) => { console.log(authData); if (!authData.id) throw Error(`Cairo didn't return the expected data! ${authData.id}`); req.id = authData.id; }) .then(() => next()) .catch((err) => { ERR("AUTH", err.response ? err.response.data : err.message); if (!err.response) return res.status(500).send(`Auth failure ${err}`); return res.status(err.response.status).send(err.response.data); }); }; cairoAuthMiddleware.use([bearerTokenMiddleware(), cairoAuthHandler]); export default cairoAuthMiddleware;