После регистрации пользователя req.isAuthenticated возвращает false

Я сделал это в нескольких приложениях, и я не знаю, что здесь происходит, что не работает, когда я перехожу на свою страницу входа в систему и вхожу в систему, тогда у меня есть зарегистрированный пользователь, с которым может работать. Но в моем маршруте регистрации после регистрации пользователя я вызываю password.authenticate, но пользователь не проходит аутентификацию, и у меня нет пользователя, с которым можно работать, я не знаю, что не так. Я также написал маршрут сообщения регистра в формате обратного вызова без async / await без разницы. И пользователи добавляются в мою базу данных, поэтому они регистрируются.

Вот мой код:

router.get('/register', function(req, res) {
   res.render('register')
});

router.post('/register', async (req, res) => {
    try{
       var newUser = new User({username: req.body.username});
       await User.register(newUser, req.body.password);
       await passport.authenticate('local');
       console.info("The user is authenticated: " + req.isAuthenticated())
       res.redirect('/');
    }
    catch(err) {
        console.info(err);
        res.redirect('/');
    }
});

Console.log возвращает false.

Модель пользователя:

var mongoose              = require('mongoose'),
    passportLocalMongoose = require('passport-local-mongoose');

var UserSchema = new mongoose.Schema({
    username:     String,
    password: String
});

UserSchema.plugin(passportLocalMongoose);

module.exports = mongoose.model('User', UserSchema);

Страница регистрации:

<% include ./partials/header %>

<h1>Please Sign-Up</h1>

<form action='register' method='POST'>
    <label>Username</label>
    <input type='text' name='username'>
    <label>Password</label>
    <input type='password' name='password'>

    <button type='submit'>Submit</button>
</form>


<% include ./partials/footer %>

в моем файле app.js:

app.use(function(req,res,next) {
  console.info("Current user is: " + req.user)
  res.locals.currentUser = req.user;
  next();
});

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
333
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Ну, во-первых, вы здесь неправильно используете passport.authenticate - эта функция возвращает правильное промежуточное ПО, совместимое с подключением / экспресс-доставкой, для переданного вами типа стратегии, в вашем случае local. Так что на самом деле, если вы действительно хотите использовать его таким образом, вам нужно будет назвать его как passport.authenticate('local')(req, res, next) ... однако я не думаю, что вы действительно хотите это делать.

Здесь у вас есть три отдельные операции

  1. зарегистрировать пользователя
  2. аутентифицировать пользователя
  3. перенаправить пользователя

Что для меня должно происходить как три отдельных промежуточного программного обеспечения, т.е.

const registerUser = async (req, res, next) => {
  try {
    const { username, password } = req.body;
    const user = new User({ username });
    await User.register(user, password);
    return next();
  } catch (e) {
    return next(e);
  }
}

router.post('/register', 
  registerUser, // register user in the DB
  passport.authenticate('local'), // authenticate user credentials
  (req, res) => res.redirect('/') // redirect user
)

Итак, просто чтобы понять, что здесь происходит, при попадании в маршрут /register он сначала попытается зарегистрировать пользователя через промежуточное программное обеспечение registerUser. Предполагая, что здесь все идет хорошо, мы вызываем next для вызова следующего промежуточного программного обеспечения, которое является нашей локальной стратегией паспорта (учетные данные все еще будут в req.body из первоначального запроса). Затем, наконец, если наша аутентификация прошла успешно, паспорт вызовет следующее доступное промежуточное программное обеспечение, которое является нашим вызовом перенаправления.

Привет, Джеймс, большое спасибо за ответ. Я действительно застрял там. Я новичок в веб-разработке, узнал из онлайн-курса, они фактически научили методу Passport.authenticate ('local') (req, res, next), который я использовал, и на самом деле пробовал его здесь и не работал, обычно делает хотя может я что то не так сделал? Не могли бы вы сказать мне, почему вы сказали, что я не должен использовать этот метод ??? Кроме того, если вы могли бы, я не понимаю, почему то, что я делал, не работало, кажется, должно быть, не могли бы вы объяснить это мне, я действительно хочу научиться и стать лучше в этом. Огромное спасибо

Jack 25.07.2018 18:36

@Jack, как объясняется в ответе, passport.authenticate специально разработан для работы в качестве промежуточного программного обеспечения, вы, конечно, можете использовать его напрямую, однако он написан таким образом, что его можно подключить к экспресс-маршруту (как показано в моем ответе).

James 25.07.2018 19:15

есть ли причина, по которой вы создаете const registerUser вместо того, чтобы просто делать его функцией с именем registerUser?

Jack 25.07.2018 19:44

@Jack в этом сценарии, кроме возможности использовать синтаксис стрелки, нет - async function registerUser(...) будет работать точно так же.

James 25.07.2018 20:06

Спасибо! перебрал ваш ответ несколько раз стал понятнее!

Jack 25.07.2018 20:36

Другие вопросы по теме