Files
ipwhitelist-app/ui/routes/auth.js
T

79 lines
2.9 KiB
JavaScript

'use strict';
/**
* ui/routes/auth.js — /login, /logout для UI-слоя.
*
* Два режима:
* Mock (DEV_MODE=true) — страница с пресетами MOCK_USERS.
* Выбранный пользователь → генерируем mock Bearer token → session.token.
*
* Token (всегда доступен) — форма вставки реального Bearer токена от auth-api/KC.
* Вставленный токен → session.token (без проверки подписи здесь,
* API сам проверит при первом запросе).
*
* /logout — уничтожает сессию.
*/
const { Router } = require('express');
function createRouter({ auth, MOCK_USERS, authLimiter }) {
const router = Router();
const devMode = () => process.env.DEV_MODE === 'true';
// GET /login
router.get('/login', (req, res) => {
if (req.session && req.session.token) return res.redirect('/');
res.render('ui-login', {
devMode: devMode(),
MOCK_USERS: devMode() ? MOCK_USERS : [],
error: req.query.error || null,
returnTo: req.query.returnTo || '/',
});
});
// POST /login — mock user
router.post('/login', authLimiter, (req, res) => {
const { clientId, returnTo } = req.body;
if (!clientId) return res.redirect('/login?error=Выберите+пользователя');
const user = MOCK_USERS.find(u => u.clientId === clientId);
if (!user) return res.redirect('/login?error=Пользователь+не+найден');
const token = auth.issueMockToken({
clientId: user.clientId,
companyId: user.companyId || '00000000-0000-0000-0000-000000000001',
companyName: user.companyName || user.clientId,
email: user.email || user.clientId + '@mock.local',
});
req.session.token = token;
req.session.user = {
clientId: user.clientId,
email: user.email || user.clientId + '@mock.local',
companyId: user.companyId || '00000000-0000-0000-0000-000000000001',
companyName: user.companyName || user.clientId,
isAdmin: user.role === 'admin',
};
res.redirect(returnTo || '/');
});
// POST /login-token — вставить реальный Bearer токен
router.post('/login-token', authLimiter, (req, res) => {
const { token, returnTo } = req.body;
if (!token || !token.trim()) return res.redirect('/login?error=Токен+не+может+быть+пустым');
req.session.token = token.trim();
req.session.user = null; // заполнится при первом запросе к API
res.redirect(returnTo || '/');
});
// GET /logout
router.get('/logout', (req, res) => {
req.session.destroy(() => res.redirect('/login'));
});
return router;
}
module.exports = { createRouter };