77 lines
2.0 KiB
TypeScript
77 lines
2.0 KiB
TypeScript
import { Router } from 'express';
|
|
import pbkdf2Password from 'pbkdf2-password';
|
|
import { v4 as uuid } from 'uuid';
|
|
import jwt from 'jsonwebtoken';
|
|
import jwtMiddleware from 'express-jwt';
|
|
|
|
const makeHash = pbkdf2Password();
|
|
|
|
export const authRouter = Router();
|
|
|
|
const requiredFields = (fields: string[]) => (req, res, next) => {
|
|
for (const fieldName of fields) {
|
|
if (!req.body[fieldName]) {
|
|
throw new Error(`Field ${fieldName} does\'t set`)
|
|
}
|
|
}
|
|
|
|
next();
|
|
};
|
|
|
|
const users: any[] = [];
|
|
|
|
|
|
authRouter.get('/users', jwtMiddleware({ secret: process.env.JWT_SECRET_STRING, algorithms: ['HS256'] }), (req, res) => {
|
|
res.send(users);
|
|
});
|
|
|
|
authRouter.post('/sign-in', requiredFields(['password', 'login']), (req, res) => {
|
|
const { password, login } = req.body;
|
|
|
|
const user = users.find(u => u.login === login);
|
|
|
|
if (!user) {
|
|
res.status(400).send({ error: 'Login or password does\'t match' });
|
|
return;
|
|
}
|
|
|
|
makeHash({ password, salt: user.salt }, (err, pass, salt, hash) => {
|
|
if (err) throw err;
|
|
|
|
if (user.hash === hash) {
|
|
const { hash: _hash, salt: _salt, ...cleanUser } = user
|
|
|
|
req.session.user = cleanUser;
|
|
const token = jwt.sign(cleanUser, process.env.JWT_SECRET_STRING, {
|
|
|
|
});
|
|
|
|
return res.send({ token, user: cleanUser })
|
|
}
|
|
|
|
res.status(400).send({ error: 'Login or password does\'t match' });
|
|
});
|
|
});
|
|
|
|
authRouter.post('/sign-up', requiredFields(['password', 'login', 'email']), (req, res, next) => {
|
|
const { password, login, ...rest } = req.body;
|
|
|
|
makeHash({ password }, function (err, pass, salt, hash) {
|
|
if (err) throw err;
|
|
|
|
const newUser = {
|
|
id: uuid(),
|
|
...rest,
|
|
login,
|
|
salt,
|
|
hash
|
|
}
|
|
|
|
users.push(newUser);
|
|
|
|
const { hash: _hash, salt: _salt, ...cleanUser } = newUser
|
|
|
|
res.send(cleanUser);
|
|
});
|
|
});
|