Notes/src/etapi/auth.ts

45 lines
1.5 KiB
TypeScript
Raw Normal View History

import becca from "../becca/becca.js";
import eu from "./etapi_utils.js";
import passwordEncryptionService from "../services/encryption/password_encryption.js";
import etapiTokenService from "../services/etapi_tokens.js";
import type { RequestHandler, Router } from "express";
2022-01-10 17:09:20 +01:00
2024-04-07 15:17:45 +03:00
function register(router: Router, loginMiddleware: RequestHandler[]) {
2025-01-09 18:07:02 +02:00
eu.NOT_AUTHENTICATED_ROUTE(router, "post", "/etapi/auth/login", loginMiddleware, (req, res, next) => {
const { password, tokenName } = req.body;
2022-01-10 17:09:20 +01:00
if (!passwordEncryptionService.verifyPassword(password)) {
throw new eu.EtapiError(401, "WRONG_PASSWORD", "Wrong password.");
}
2025-01-09 18:07:02 +02:00
const { authToken } = etapiTokenService.createToken(tokenName || "ETAPI login");
res.status(201).json({
2022-01-10 17:09:20 +01:00
authToken
});
});
2025-01-09 18:07:02 +02:00
eu.route(router, "post", "/etapi/auth/logout", (req, res, next) => {
2022-01-10 17:09:20 +01:00
const parsed = etapiTokenService.parseAuthToken(req.headers.authorization);
if (!parsed || !parsed.etapiTokenId) {
throw new eu.EtapiError(400, eu.GENERIC_CODE, "Cannot logout this token.");
}
const etapiToken = becca.getEtapiToken(parsed.etapiTokenId);
2022-01-10 17:09:20 +01:00
if (!etapiToken) {
// shouldn't happen since this already passed auth validation
2023-05-04 22:16:18 +02:00
throw new Error(`Cannot find the token '${parsed.etapiTokenId}'.`);
2022-01-10 17:09:20 +01:00
}
2022-01-10 17:09:20 +01:00
etapiToken.markAsDeletedSimple();
2022-01-10 17:09:20 +01:00
res.sendStatus(204);
});
}
export default {
2022-01-10 17:09:20 +01:00
register
2025-01-09 18:07:02 +02:00
};