91 lines
3.0 KiB
JavaScript
91 lines
3.0 KiB
JavaScript
import Service from "../Service";
|
||
import jwt from "jsonwebtoken";
|
||
import {User} from "../../models";
|
||
import bcrypt from "bcrypt";
|
||
|
||
class AuthService extends Service {
|
||
|
||
async auth(token, done) {
|
||
try {
|
||
const decoded = jwt.verify(token, process.env.JWT_SECRET);
|
||
const user = await User.findByPk(decoded.userId);
|
||
if (!user) {
|
||
return done(null, false);
|
||
} else {
|
||
return done(null, user);
|
||
}
|
||
} catch (e) {
|
||
return done(null, false);
|
||
}
|
||
}
|
||
|
||
|
||
async login(req, res) {
|
||
try {
|
||
// Получаем email и пароль из тела запроса
|
||
const {username, password} = req.body;
|
||
|
||
// Находим пользователя по username
|
||
const user = await User.scope('withPassword').findOne({where: {username}});
|
||
|
||
// Если пользователь не найден, возвращаем ошибку
|
||
if (!user) {
|
||
console.log(`User not found ${username}`);
|
||
return res.status(401).json({message: 'Неверное имя пользователя или пароль'});
|
||
}
|
||
|
||
|
||
// Сравниваем пароль из запроса с хешированным паролем пользователя
|
||
const isPasswordValid = await bcrypt.compare(password, user.password);
|
||
|
||
// Если пароль неверный, возвращаем ошибку
|
||
if (!isPasswordValid) {
|
||
return res.status(401).json({message: 'Неверное имя пользователя или пароль'});
|
||
}
|
||
|
||
// Создаем JWT-токен
|
||
const token = jwt.sign({userId: user.id}, process.env.JWT_SECRET, {
|
||
expiresIn: '1h',
|
||
});
|
||
|
||
// Возвращаем токен
|
||
res.json({token});
|
||
} catch (error) {
|
||
console.error(error);
|
||
res.status(500).json({message: 'Internal server error'});
|
||
}
|
||
}
|
||
|
||
|
||
async logout(req, res) {
|
||
try {
|
||
// Удаляем токен из заголовка авторизации
|
||
res.clearCookie('token');
|
||
res.json({message: 'Вы успешно вышли из системы'});
|
||
} catch (error) {
|
||
console.error(error);
|
||
res.status(500).json({message: 'Internal server error'});
|
||
}
|
||
}
|
||
|
||
|
||
async generatePasswordHash(req, res) {
|
||
if (process.env.NODE_ENV === 'development') {
|
||
// Get passwort from get request
|
||
const password = req.query.password;
|
||
|
||
// Hash password
|
||
bcrypt.hash(password, 10, (err, hash) => {
|
||
if (err) {
|
||
console.error(err);
|
||
return res.status(500).json({message: 'Internal server error'});
|
||
}
|
||
console.log(hash)
|
||
return res.json({hash});
|
||
});
|
||
}
|
||
}
|
||
|
||
}
|
||
|
||
export default new AuthService |