Как прошить сообщение от Passport.js? - PullRequest
0 голосов
/ 29 сентября 2018

Я создал логин и зарегистрировался с экспресс и паспортом js.Я хочу добавить сообщение о неверном пароле или адресе электронной почты.

в моем index.js (main) добавлено промежуточное ПО для паспорта и анализатора тела со ссылкой на маршруты:

app.use(bodyParser.urlencoded({ extended: false }));
app.use(bodyParser.json());

// route files
let index = require("./routes/index");
let auth = require("./routes/auth");
app.use("/", index);
app.use("/auth", auth);

, и я создалКонфигурация паспорта:

const LocalStrategy = require("passport-local").Strategy;
const User = require("../models/User");
const config = require("../config/database");
const bcrypt = require("bcryptjs");

module.exports = function(passport) {
  // Local Strategy
  passport.use(
    new LocalStrategy(
      {
        usernameField: "email",
        passwordField: "password"
      },
      (username, password, done) => {
        // Match Email
        let query = { email: username };
        User.findOne(query, function(err, user) {
          if (err) throw err;
          if (!user) {
            return done(null, false, { message: "No user found" });
          }

          // Match Password
          bcrypt.compare(password, user.password, function(err, isMatch) {
            if (err) throw err;
            if (isMatch) {
              return done(null, user);
            } else {
              return done(null, false, { message: "Wrong password" });
            }
          });
        });
      }
    )
  );

  passport.serializeUser(function(user, done) {
    done(null, user.id);
  });

  passport.deserializeUser(function(id, done) {
    User.findById(id, function(err, user) {
      done(err, user);
    });
  });
};

также добавил для него маршрут:

// Login Process
router.post("/login", (req, res, next) => {
  passport.authenticate("local", {
    successRedirect: "/",
    failureRedirect: "/auth/login",

    failureFlash: true
  })(req, res, next);
});

successRedirect и faultRedirect работают нормально, но это не дает мне никакой ошибки.Я сделал это на YouTube видео в видео это работает, но в моем коде это не так.

конфигурация подключенной вспышки:

const flash = require("connect-flash");
app.use(require("connect-flash")());

Ответы [ 3 ]

0 голосов
/ 04 октября 2018

Во-первых, я не совсем вижу смысла конфигурировать app.use() с помощью require.Просто вызовите метод flash() внутри app.use(), как это указано в вашей конфигурации.

var flash = require("connect-flash");
app.use(flash());

Что вам не хватает, так это req.flash("error").Потому что, когда происходит сбой, паспорт передает объект message как error.

Проверка подлинности паспорта

Если для параметра failureFlash установлено значение true, команда Passport указываетмигать сообщение error, используя сообщение, переданное обратным вызовом проверки стратегии, если таковой имеется.

Этот код работает на моем конце и передает сообщения req.flash ().

rout.js

//route for passport strategy
    router.post("/login", passport.authenticate("local-signin", {
        failureRedirect: "/error",
        failureFlash: true,
    }));

//route for error page
router.get("/error", function(req, res, next) {
    res.render("error", {
        error: req.flash("error"),
    });
});

ВклТеперь у вас есть доступ к объекту error, поэтому вы можете использовать его для просмотра.В моем представлении error.hbs руля я делаю это.

error.hbs

{{#if error}}
    {{error}}
//Wrong password or No User Found
{{/if}}
<p>No results to show.</p>

Надеюсь, это поможет.

0 голосов
/ 18 марта 2019

Более простой маршрут для отображения успешных / неудачных флеш-сообщений:

router.post('/login', passport.authenticate("local", 
    {
        successRedirect: "/",
        failureRedirect: "/auth/login",
        successFlash: true,            
        failureFlash: true,
        successFlash: 'Succesfu1!',
        failureFlash: 'Invalid username or passwerd.'
    })
);
0 голосов
/ 29 сентября 2018

Ничего плохого в вашем коде, это просто версия Express, которую вы используете.Из документации по Flash-сообщениям Passportjs

Примечание. Для использования флэш-сообщений требуется функция req.flash () .Express 2.x предоставил эту функциональность, однако он был удален из Express 3.x.Использование промежуточного программного обеспечения connect-flash рекомендуется для обеспечения этой функциональности при использовании Express 3.x.

Поэтому вам необходимо установить connect-flash промежуточное программное обеспечение Express в соответствии с рекомендациями.

var flash = require('connect-flash');
var app = express();

app.configure(function() {
  app.use(express.cookieParser('keyboard cat'));
  app.use(express.session({ cookie: { maxAge: 60000 }}));
  app.use(flash());
});

При наличии промежуточного программного обеспечения для флэш-памяти все запросы будут иметь функцию req.flash (), которую можно использовать для сообщений флэш-памяти.

app.get('/flash', function(req, res){
  req.flash('info', 'Flash is back!')
  res.redirect('/');
});

app.get('/', function(req, res){
  res.render('index', { messages: req.flash('info') });
});

Это может помочь вам.

...