/
Coderdev
/
web-nodejs-labs
Обзор
Документация
Войти
/
Coderdev
/
web-nodejs-labs
Код
Запросы
0
Задачи
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
backend/src/routes/lab11/auth.js
106 строк
3 KB
Coderdev
1
12 май 2026, 12:34
12 май 2026, 12:34
f5e899f
Код
Авторство
О чём код?
// backend/src/routes/lab11/auth.js import bcrypt from 'bcrypt'; import { isLoginTaken, createUser, findUserByLogin, updateUserPassword, } from '../../services/lab11/user.service.js'; export default async function authRoutes(fastify) { // POST /api/lab11/register fastify.post('/register', { schema: { body: { type: 'object', required: ['login', 'password'], properties: { login: { type: 'string', minLength: 3 }, password: { type: 'string', minLength: 6 }, }, }, }, }, async (request, reply) => { const { login, password } = request.body; const pg = fastify.pg; const taken = await isLoginTaken(pg, login); if (taken) { return reply.code(400).send({ error: 'Пользователь с таким логином уже существует' }); } const passwordHash = await bcrypt.hash(password, 10); const user = await createUser(pg, { login, passwordHash, roleName: 'user' }); reply.code(201); return { id: user.id, login: user.login, role_id: user.role_id, created_at: user.created_at }; }); // POST /api/lab11/login fastify.post('/login', { schema: { body: { type: 'object', required: ['login', 'password'], properties: { login: { type: 'string', minLength: 3 }, password: { type: 'string', minLength: 6 }, }, }, }, }, async (request, reply) => { const { login, password } = request.body; const pg = fastify.pg; const user = await findUserByLogin(pg, login); if (!user) return reply.code(401).send({ error: 'Неверный логин или пароль' }); const ok = await bcrypt.compare(password, user.password_hash); if (!ok) return reply.code(401).send({ error: 'Неверный логин или пароль' }); const token = fastify.jwt.sign( { id: user.id, login: user.login, role: user.role }, { expiresIn: '2h' } ); return { token, user: { id: user.id, login: user.login, role: user.role } }; }); // POST /api/lab11/logout (клиентский — просто сигнал, токен удаляется на клиенте) fastify.post('/logout', { onRequest: [fastify.authenticate], }, async (request, reply) => { // JWT stateless — реальный логаут делается на клиенте (удалить токен) return { message: 'Выход выполнен' }; }); // POST /api/lab11/change-password fastify.post('/change-password', { onRequest: [fastify.authenticate], schema: { body: { type: 'object', required: ['oldPassword', 'newPassword'], properties: { oldPassword: { type: 'string', minLength: 6 }, newPassword: { type: 'string', minLength: 6 }, }, }, }, }, async (request, reply) => { const { oldPassword, newPassword } = request.body; const pg = fastify.pg; const user = await findUserByLogin(pg, request.user.login); if (!user) return reply.code(404).send({ error: 'Пользователь не найден' }); const ok = await bcrypt.compare(oldPassword, user.password_hash); if (!ok) return reply.code(400).send({ error: 'Неверный текущий пароль' }); const newHash = await bcrypt.hash(newPassword, 10); await updateUserPassword(pg, user.id, newHash); return { message: 'Пароль успешно изменён' }; }); }