#node.js #angular #authentication #passport.js #mean-stack
#node.js #angular #аутентификация #passport.js #имеется в виду-стек
Вопрос:
Я создаю приложение для каталога продуктов MEAN Stack. Node.js выдает мне пользователя, вошедшего в систему, в моем маршруте входа, когда я проверяю req.IsAuthenticated(). Но когда я пытаюсь позже проверить, вошел ли я в систему, он выдает req.user как undefined.
Как мне заставить пользователя сохраняться? Я знаю, что могу использовать локальное хранилище, но есть ли способ лучше?
var express = require('express');
var cors = require('cors');
var bodyParser = require('body-parser');
var passport = require('passport');
var mongoose = require('mongoose');
var LocalStrategy = require('passport-local');
var passportLocalMongoose = require('passport-local-mongoose');
app = express();
app.use(require('express-session')({secret:"timelord",resave:false,saveUninitialized:false}));
app.use(cors());
app.use(bodyParser.json());
app.use(bodyParser.urlencoded({ extended: true }));
app.use(passport.initialize());
app.use(passport.session());
mongoose.set('useNewUrlParser', true);
mongoose.set('useUnifiedTopology', true);
mongoose.connect('mongodb://127.0.0.1:27017/delectabledb');
var UserSchema = new mongoose.Schema({name: String,
gender: String,
dob: String,
country:String,
phone: String,
email: String,
password: String,
username: String,
prof: String});
UserSchema.plugin(passportLocalMongoose);
var User = mongoose.model("User", UserSchema);
passport.use(new LocalStrategy(User.authenticate()));
passport.serializeUser(User.serializeUser());
passport.deserializeUser(User.deserializeUser());
app.post('/loginUser', function(req, res, next) {
passport.authenticate('local', function(err, user, info) {
console.log(req.user) //returns false
if (err) { return next(err); }
if (!user) { res.send({code:"500"}); }
req.logIn(user, function(err) {
console.log(req.user) //returns true
if (err) { return next(err); }
res.send({code:"200", user:user});
});
})(req, res, next);
});
app.listen(3000, ()=>{
console.log("Running server on port 3000...");
});
Комментарии:
1. Если
req.user
не определено, возможно, вы не добавляетеJWT
в запрос (со стороны клиента) или в вашемpassport-js
обратном вызове чего-то не хватает (пожалуйста, добавьте фрагмент кода).2. @Daniel, спасибо за ответ. Я добавил фрагмент кода. Итак, в маршруте LoginUser он выводит false, а затем true, что ожидается. Если я снова нажму на маршрут для входа в систему, разве он не должен печатать true и true, потому что я уже вошел в систему?