- Manage multiple login, in different browsers... Multi Token...

This commit is contained in:
Paolo Arena
2019-02-09 18:03:14 +01:00
parent 318ff7a798
commit 636ee92786
8 changed files with 50 additions and 28 deletions

View File

@@ -1,3 +1,5 @@
const server_constants = require('../tools/server_constants');
var {User} = require('../models/user'); var {User} = require('../models/user');
const tools = require('../tools/general'); const tools = require('../tools/general');
@@ -5,20 +7,25 @@ const tools = require('../tools/general');
var authenticate = (req, res, next) => { var authenticate = (req, res, next) => {
var token = req.header('x-auth'); var token = req.header('x-auth');
tools.mylogshow("TOKEN = " + token); const useragent = req.get('User-Agent');
User.findByToken(token).then((user) => { tools.mylog("TOKEN = ", token);
tools.mylog("USER-AGENT = ", useragent);
User.findByToken(token, 'auth ' + useragent).then((user) => {
if (!user) { if (!user) {
return Promise.reject(); tools.mylogshow("TOKEN NOT FOUND! Maybe Connected to other Page");
return Promise.reject(server_constants.RIS_CODE_HTTP_INVALID_TOKEN);
// res.status().send();
} }
tools.mylogshow('userid', user._id) tools.mylog('userid', user._id);
req.user = user; req.user = user;
req.token = token; req.token = token;
next(); next();
}).catch((e) => { }).catch((e) => {
tools.mylogshow("ERR = " + e); tools.mylogshow("ERR =", e);
res.status(401).send(); res.status(server_constants.RIS_CODE_HTTP_INVALID_TOKEN).send();
}); });
}; };

View File

@@ -4,6 +4,8 @@ const validator = require('validator');
const jwt = require('jsonwebtoken'); const jwt = require('jsonwebtoken');
const _ = require('lodash'); const _ = require('lodash');
const tools = require('../tools/general');
mongoose.Promise = global.Promise; mongoose.Promise = global.Promise;
mongoose.level = "F"; mongoose.level = "F";
@@ -80,19 +82,23 @@ UserSchema.methods.toJSON = function () {
return _.pick(userObject, ['_id', 'email', 'verified_email', 'username', 'userId']); return _.pick(userObject, ['_id', 'email', 'verified_email', 'username', 'userId']);
}; };
UserSchema.methods.generateAuthToken = function () { UserSchema.methods.generateAuthToken = function (req) {
// console.log("GENERA TOKEN : "); // console.log("GENERA TOKEN : ");
var user = this; var user = this;
var access = 'auth';
const useragent = req.get('User-Agent');
tools.mylog("GENERATE USER-AGENT = ", useragent);
var access = 'auth ' + useragent;
var token = jwt.sign({ _id: user._id.toHexString(), access }, process.env.SIGNCODE).toString(); var token = jwt.sign({ _id: user._id.toHexString(), access }, process.env.SIGNCODE).toString();
// CANCELLA I PRECEDENTI ! // CANCELLA IL PRECEDENTE !
user.tokens = []; user.tokens = user.tokens.filter(function(tok) { return tok.access !== access; });
user.tokens.push({ access, token }); user.tokens.push({ access, token });
return user.save() return user.save()
.then(() => { .then(() => {
//console.log("TOKEN USCITA : " + token) console.log("TOKEN CREATO IN LOGIN : " + token)
return token; return token;
}) })
.catch(err => { .catch(err => {
@@ -100,20 +106,20 @@ UserSchema.methods.generateAuthToken = function () {
}); });
}; };
UserSchema.statics.findByToken = function (token) { UserSchema.statics.findByToken = function (token, typeaccess) {
var User = this; var User = this;
var decoded; var decoded;
try { try {
decoded = jwt.verify(token, process.env.SIGNCODE); decoded = jwt.verify(token, process.env.SIGNCODE);
} catch (e) { } catch (e) {
return Promise.reject(); return Promise.resolve(null);
} }
return User.findOne({ return User.findOne({
'_id': decoded._id, '_id': decoded._id,
'tokens.token': token, 'tokens.token': token,
'tokens.access': 'auth' 'tokens.access': typeaccess
}); });
}; };

View File

@@ -87,7 +87,7 @@ router.post(process.env.LINK_UPDATE_PASSWORD, (req, res) => {
user.password = password; user.password = password;
// Crea token // Crea token
user.generateAuthToken().then(token => { user.generateAuthToken(req).then(token => {
user.tokenforgot = ''; // Svuota il tokenforgot perché non ti servirà più... user.tokenforgot = ''; // Svuota il tokenforgot perché non ti servirà più...
// Salva lo User // Salva lo User

View File

@@ -38,7 +38,7 @@ router.post('/', authenticate, (req, res) => {
return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER }); return res.status(404).send({ code: server_constants.RIS_CODE_TODO_CREATING_NOTMYUSER });
} }
tools.mylog('POST ', todo.descr); tools.mylog('POST :', todo.descr, todo._id);
todo.modified = false; todo.modified = false;
if (!todo.descr) { if (!todo.descr) {
@@ -51,7 +51,7 @@ router.post('/', authenticate, (req, res) => {
let idobj = writeresult._id; let idobj = writeresult._id;
Todo.findById(idobj) Todo.findById(idobj)
.then(record => { .then(record => {
tools.mylog('REC SAVED :', record); tools.mylog('REC SAVED :', record.descr);
res.send({record}); res.send({record});
}) })
}).catch((e) => { }).catch((e) => {
@@ -154,6 +154,8 @@ router.patch('/:id', authenticate, (req, res) => {
todo.modified = false; todo.modified = false;
tools.mylog('PATCH ', todo.descr, todo._id);
res.send({todo}); res.send({todo});
}).catch((e) => { }).catch((e) => {
res.status(400).send(); res.status(400).send();
@@ -178,7 +180,7 @@ router.get('/:userId', authenticate, (req, res) => {
// Extract all the todos of the userId only // Extract all the todos of the userId only
Todo.findAllByUserId(userId).then((todos) => { Todo.findAllByUserId(userId).then((todos) => {
tools.mylog('todos', todos) // tools.mylog('todos', todos)
res.send({ todos }); res.send({ todos });
}).catch((e) => { }).catch((e) => {
console.log(e); console.log(e);
@@ -187,7 +189,7 @@ router.get('/:userId', authenticate, (req, res) => {
}); });
router.delete('/:id', (req, res) => { router.delete('/:id', authenticate, (req, res) => {
var id = req.params.id; var id = req.params.id;
if (!ObjectID.isValid(id)) { if (!ObjectID.isValid(id)) {
@@ -199,6 +201,8 @@ router.delete('/:id', (req, res) => {
return res.status(404).send(); return res.status(404).send();
} }
tools.mylog('DELETED ', todo.descr, todo._id);
res.send({todo}); res.send({todo});
}).catch((e) => { }).catch((e) => {
res.status(400).send(); res.status(400).send();

View File

@@ -36,7 +36,7 @@ router.post('/', (req, res) => {
tools.mylog("TROVATO USERNAME ? ", user.username, usertrovato); tools.mylog("TROVATO USERNAME ? ", user.username, usertrovato);
if (usertrovato !== null) { if (usertrovato !== null) {
return user.generateAuthToken(); return user.generateAuthToken(req);
} else { } else {
res.status(11100).send(); res.status(11100).send();
return 0; return 0;
@@ -76,7 +76,7 @@ router.post('/login', (req, res) => {
var body = _.pick(req.body, ['username', 'password', 'idapp', 'keyappid', 'lang']); var body = _.pick(req.body, ['username', 'password', 'idapp', 'keyappid', 'lang']);
var user = new User(body); var user = new User(body);
tools.mylog("username: " + user.username + " pwd = " + user.password); tools.mylog("LOGIN: username: " + user.username + " pwd = " + user.password);
tools.mylog("user REC:", user); tools.mylog("user REC:", user);
@@ -91,7 +91,7 @@ router.post('/login', (req, res) => {
tools.mylogshow("NOT FOUND !"); tools.mylogshow("NOT FOUND !");
res.status(404).send({ code: server_constants.RIS_CODE_LOGIN_ERR }); res.status(404).send({ code: server_constants.RIS_CODE_LOGIN_ERR });
} else { } else {
return user.generateAuthToken().then((token) => { return user.generateAuthToken(req).then((token) => {
var usertosend = User(); var usertosend = User();
usertosend.username = user.username; usertosend.username = user.username;
usertosend.email = user.email; usertosend.email = user.email;
@@ -105,10 +105,12 @@ router.post('/login', (req, res) => {
// tools.mylog(usertosend); // tools.mylog(usertosend);
res.header('x-auth', token).send({usertosend, code: server_constants.RIS_CODE_OK}); res.header('x-auth', token).send({usertosend, code: server_constants.RIS_CODE_OK});
// tools.mylog("TROVATOOO!"); // tools.mylog("TROVATOOO!");
tools.mylog('FINE LOGIN')
}); });
} }
}).catch((e) => { }).catch((e) => {
tools.mylog("ERR: " + e); tools.mylog("ERRORE IN LOGIN: " + e);
res.status(400).send({ code: server_constants.RIS_CODE_LOGIN_ERR_GENERIC }); res.status(400).send({ code: server_constants.RIS_CODE_LOGIN_ERR_GENERIC });
}); });
}); });

View File

@@ -120,4 +120,3 @@ if (process.env.NODE_ENV === 'production') {
//}); //});
module.exports = { app }; module.exports = { app };

View File

@@ -170,12 +170,12 @@ describe('DELETE /users/me/token', () => {
}); });
}); });
it('should return 401 deleting an invalid token', (done) => { it('should return 403 deleting with an invalid token', (done) => {
request(app) request(app)
.delete('/users/me/token') .delete('/users/me/token')
.set('x-auth', users[0].tokens[0].token + '1') .set('x-auth', users[0].tokens[0].token + '1')
.send() .send()
.expect(401) .expect(403)
.end((err, res) => { .end((err, res) => {
if (err) { if (err) {
return done(err); return done(err);
@@ -276,14 +276,15 @@ describe('GET /todos/:id', () => {
.end(done); .end(done);
}); });
it('should return [] if user not found', (done) => { it('FORBIDDEN ! should return [] if user not found', (done) => {
var hexId = new ObjectID().toHexString(); var hexId = new ObjectID().toHexString();
request(app) request(app)
.get(`/todos/${users[0]._id + '111'}`) .get(`/todos/${hexId}`)
.set('x-auth', users[0].tokens[0].token) .set('x-auth', users[0].tokens[0].token)
.expect(404) .expect(404)
.expect((res) => { .expect((res) => {
console.log('res', res.status)
expect(res.body.todos).toBe(undefined); expect(res.body.todos).toBe(undefined);
}) })
.end(done); .end(done);

View File

@@ -10,4 +10,7 @@ module.exports = Object.freeze({
RIS_CODE_OK: 1, RIS_CODE_OK: 1,
RIS_CODE_LOGIN_OK: 1, RIS_CODE_LOGIN_OK: 1,
RIS_CODE_HTTP_INVALID_TOKEN: 403,
}); });