- Manage multiple login, in different browsers... Multi Token...
This commit is contained in:
@@ -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();
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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 });
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -120,4 +120,3 @@ if (process.env.NODE_ENV === 'production') {
|
|||||||
//});
|
//});
|
||||||
|
|
||||||
module.exports = { app };
|
module.exports = { app };
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user