WebService-Boilerplate/modules/Auth/AuthService.js

91 lines
3.0 KiB
JavaScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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