【问题标题】:How to flash a message from Passport.js?如何从 Passport.js 闪烁消息?
【发布时间】:2019-03-05 04:34:49
【问题描述】:

我已经使用 express 和 passport 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 和 failureRedirect 工作正常,但它没有给我任何错误。我在它的视频中的 youtube 视频上做了它,但在我的代码中它没有。

连接闪存的配置:

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

【问题讨论】:

    标签: node.js express passport.js passport-local


    【解决方案1】:

    您的代码没有问题,它只是您使用的 express 版本。来自 Passportjs Flash Message 文档,

    注意:使用 flash 消息需要 req.flash() 函数。 Express 2.x 提供了此功能,但它已从 Express 3.x 中删除。使用 Express 3.x 时,建议使用 connect-flash 中间件来提供此功能。

    所以你需要按照推荐安装 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());
    });
    

    使用 flash 中间件,所有请求都将具有可用于 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') });
    });
    

    这可能会对你有所帮助。

    【讨论】:

    • 我已经安装它并使用 req.flash() 将它用于其他闪存消息,但我不知道如何在这里使用它
    • npmjs.com/package/connect-flash。在这里您可以找到使用 connect-flash 的示例。
    • 我知道我在这个项目中使用过它,但我使用它在故障闪存中不起作用,即使使用另一个 routee
    • 向我展示您对该库的配置和使用情况。
    • 感谢连接闪存的问题,但我找不到解决方法
    【解决方案2】:

    首先,我不太明白配置的意义 app.use() 需要。只需在配置中像这样调用app.use() 中的flash() 方法即可。

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

    您缺少的是req.flash("error")。因为当发生故障时,passport 将message 对象作为error 传递。

    Passport Authenticate

    failureFlash 选项设置为 true 会指示 Passport 刷新 error 消息使用策略验证给出的消息 回调,如果有的话。

    此代码在我的最后工作并传递 req.flash() 消息。

    routes.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>
    

    希望这会有所帮助。

    【讨论】:

      【解决方案3】:

      显示成功/失败消息的更简单路径:

      router.post('/login', passport.authenticate("local", 
          {
              successRedirect: "/",
              failureRedirect: "/auth/login",
              successFlash: true,            
              failureFlash: true,
              successFlash: 'Succesfu1!',
              failureFlash: 'Invalid username or passwerd.'
          })
      );
      

      【讨论】:

        【解决方案4】:

        要在不使用 flash 选项的情况下返回消息,请像这样更改您的发布方法

        router.post('/users/signin', function (req, res, next) {
          passport.authenticate('local', function (err, user, info) {
            if (err) {
              return next(err);
            }
            if (!user) {
              // *** Display message without using flash option
              res.status(500).send({ message: info.message });
            } else {
              // *** Display message without using flash option
              res.status(200).send({ message: 'success' });
            }
          })(req, res, next);
        });
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-14
          • 2016-06-08
          • 2013-09-22
          相关资源
          最近更新 更多