Я пытаюсь ответить на ваши вопросы:
Нужно ли отправлять объект пользователя и клиенту?
зависит от того, нужен ли вам пользователь, которого вы можете отправитьЭто.Я обычно храню пользовательский объект в req.user
, создавая промежуточное ПО, например authMiddleware, например:
const { User } = require('../models/user');
let authenticate = function (req, res, next) {
let token = req.cookies.access_token;
User.findByToken(token).then((user) => {
req.user = user;
req.token = token;
next();
}).catch(e => {
res.redirect('/');
})
}
module.exports = {
authenticate
}
Я предполагаю, что вы используете mongodb и mongoose.Что такое метод findByToken ()?это пользовательский метод мангуста:
// user model
const mongoose = require('mongoose');
let UserSchema = new mongoose.Schema({
...your model schema,
tokens: [{ //here is tokens array
access: {
type: String,
required: true
},
token: {
type: String,
required: true
}
}],
}
UserSchema.statics.findByToken = function (token) {
let user = this;
let decoded;
try {
decoded = jwt.verify(token, 'secret')
} catch (e) {
return Promise.reject();
}
return user.findOne({
'_id': decoded._id,
'tokens.access': 'auth',
'tokens.token': token
})
}
let User = mongoose.model('User', UserSchema);
module.exports = { User };
Так вы бы отправили идентификатор пользователя клиенту?Вы сохраняете его в локальном хранилище браузера с токеном и удаляете его при удалении токена?
после пения токена вы должны хранить токен в токенах Массив документа модели пользователя
UserSchema.methods.generateAuthToken = function () {
let user = this;
let access = 'auth';
let token = jwt.sign({ '_id': user._id.toHexString(), access }, 'secret').toString();
user.tokens = user.tokens.concat([{ access, token }]);
return user.save().then(() => {
return token;
})
}
Рекомендуется хранить токен в cookie:
res.cookie('access_token', token, {
maxAge: 3600000,
httpOnly: true
})