Migrating login/registration from username to email

This commit is contained in:
Selim Mustafaev 2020-09-08 16:39:56 +03:00
parent 85e9c159da
commit 7df7f1053b
3 changed files with 50 additions and 20 deletions

View File

@ -5,16 +5,16 @@ const hash = Symbol();
const sha256 = text => crypto.createHash('sha256').update(text).digest('base64'); const sha256 = text => crypto.createHash('sha256').update(text).digest('base64');
class User { class User {
constructor(login = '', password = '') { constructor(email = '', password = '') {
this._id = uuid(); this._id = uuid();
this.login = login; this.email = email;
this[hash] = sha256(password); this[hash] = sha256(password);
} }
static fromDB(dbUser) { static fromDB(dbUser) {
let user = new User(); let user = new User();
user._id = dbUser._id; user._id = dbUser._id;
user.login = dbUser.login; user.email = dbUser.email;
user[hash] = dbUser.hash; user[hash] = dbUser.hash;
return user; return user;
@ -23,7 +23,7 @@ class User {
toDB() { toDB() {
let user = new User(); let user = new User();
user._id = this._id; user._id = this._id;
user.login = this.login; user.email = this.email;
user.hash = this[hash]; user.hash = this[hash];
return user; return user;
} }

View File

@ -6,15 +6,15 @@ const User = require('../models/user');
const makeError = error => ({ success: false, error }); const makeError = error => ({ success: false, error });
router.post('/signup', async (req, res) => { router.post('/signup', async (req, res) => {
const { login, password } = req.body; const { email, password } = req.body;
if(login && password) { if(email && password) {
try { try {
let collection = req.db.collection('users'); let collection = req.db.collection('users');
let users = await collection.find({ login }).toArray(); let users = await collection.find({ email }).toArray();
if(users.length == 0) { if(users.length == 0) {
let user = new User(login, password); let user = new User(email, password);
await collection.insertOne(user.toDB()); await collection.insertOne(user.toDB());
user.token = jwt.sign({ login }, '#IWantToBelieve', { expiresIn: '365d' }); user.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' });
res.send({ success: true, data: user }); res.send({ success: true, data: user });
} else { } else {
res.send(makeError('User already exists')); res.send(makeError('User already exists'));
@ -29,19 +29,19 @@ router.post('/signup', async (req, res) => {
}); });
router.post('/login', async (req, res) => { router.post('/login', async (req, res) => {
const { login, password } = req.body; const { email, password } = req.body;
if(login && password) { if(email && password) {
try { try {
let users = req.db.collection('users'); let users = req.db.collection('users');
let me = await users.findOne({ login }); let me = await users.findOne({ email });
if(me) { if(me) {
me = User.fromDB(me); me = User.fromDB(me);
if(!me.checkPassword(password)) { if(!me.checkPassword(password)) {
res.send(makeError('Incorrect login or password')); res.send(makeError('Incorrect email or password'));
return; return;
} }
me.token = jwt.sign({ login }, '#IWantToBelieve', { expiresIn: '365d' }); me.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' });
res.send({ success: true, data: me }); res.send({ success: true, data: me });
} else { } else {
res.send(makeError('Incorrect login or password')); res.send(makeError('Incorrect login or password'));
@ -55,9 +55,39 @@ router.post('/login', async (req, res) => {
} }
}); });
router.post('/signIn', async (req, res) => {
const { email, password } = req.body;
if(email && password) {
try {
let users = req.db.collection('users');
let me = await users.findOne({ email });
if(me) {
me = User.fromDB(me);
if(!me.checkPassword(password)) {
res.send(makeError('Incorrect email or password'));
return;
}
me.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' });
res.send({ success: true, data: me });
} else {
let user = new User(email, password);
await users.insertOne(user.toDB());
user.token = jwt.sign({ email }, '#IWantToBelieve', { expiresIn: '365d' });
res.send({ success: true, data: user });
}
} catch(ex) {
res.send(makeError('Error logging in'));
console.error(ex);
}
} else {
res.send(makeError('Invalid parameters'));
}
});
router.get('/', async (req, res) => { router.get('/', async (req, res) => {
const { login } = req.query; const { email } = req.query;
let users = await req.db.collection('users').find({ login }).toArray(); let users = await req.db.collection('users').find({ email }).toArray();
if(users.length > 0) { if(users.length > 0) {
res.send({ success: true, data: User.fromDB(users[0]) }); res.send({ success: true, data: User.fromDB(users[0]) });
} else { } else {
@ -66,8 +96,8 @@ router.get('/', async (req, res) => {
}); });
router.get('/find', async (req, res) => { router.get('/find', async (req, res) => {
const { login } = req.query; const { email } = req.query;
let users = await req.db.collection('users').find({ login: { $regex: new RegExp(`.*${login}.*`, 'i') } }).toArray(); let users = await req.db.collection('users').find({ login: { $regex: new RegExp(`.*${email}.*`, 'i') } }).toArray();
users = users.map(user => { users = users.map(user => {
user.contacts = []; user.contacts = [];
return User.fromDB(user); return User.fromDB(user);

View File

@ -28,7 +28,7 @@ router.post('/check', async (req, res) => {
const number = req.body.number.replace(/ /g, '').toUpperCase(); const number = req.body.number.replace(/ /g, '').toUpperCase();
const googleIdToken = req.body.googleIdToken; const googleIdToken = req.body.googleIdToken;
const forceUpdate = req.body.forceUpdate.toLowerCase() == 'true'; const forceUpdate = req.body.forceUpdate.toLowerCase() == 'true';
const { login } = req.user; const { email } = req.user;
console.log(`=== checking number: ${number} ====================================`); console.log(`=== checking number: ${number} ====================================`);
@ -50,7 +50,7 @@ router.post('/check', async (req, res) => {
if(autocod.status == 'fulfilled') { if(autocod.status == 'fulfilled') {
let vehicle = autocod.value; let vehicle = autocod.value;
console.log('autocod found vehicle: ', vehicle?.brand?.name?.original); console.log('autocod found vehicle: ', vehicle?.brand?.name?.original);
vehicle.addedBy = login; vehicle.addedBy = email;
if(vin01?.status == 'fulfilled') { if(vin01?.status == 'fulfilled') {
vehicle.vin1 = vin01.value.vin1; vehicle.vin1 = vin01.value.vin1;
if(vin01.value?.brand?.name?.original == vehicle?.brand?.name?.original) { if(vin01.value?.brand?.name?.original == vehicle?.brand?.name?.original) {