node.js - 设置 connect-flash 中间件以供 passport 使用

标签 node.js express passport.js

我想访问我的 Passport 策略在其回调中指定的消息,如下所示:done(null, false, { message: 'No such user.' });。到目前为止,我发现可以通过将选项 failureFlash: true 传递到 passport.authenticate() 函数中来显示这些消息,再次使用该函数需要 connect-flash 要安装的中间件。所以我安装了模块并将 var flash = require('connect-flash); 添加到我的源代码中,并将 app.use(flash()); 添加到我的 express 应用程序的配置方法。但它仍然因方法 .flash() 不可用的错误而崩溃。我错过了什么?

更多代码:

var http = require('http');
var express = require('express');
var passport = require('passport');
var googleStrategy = require('passport-google').Strategy;
var flash = require('connect-flash');

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

passport.deserializeUser(function (obj, done) {
    done(null, obj);
});

passport.use(new googleStrategy(
    { 
        returnURL: 'http://localhost:123456/auth/google/return', 
        realm: 'http://localhost:123456/' 
    },
    function(identifier, profile, done) {
        process.nextTick(function () {
            User.findOne({ ID: identifier }, function (err, user) {
                if (err) {
                    return done(err);
                }

                if (!user) {
                    return done(null, false, { message: 'no such user' });
                }

                return done(null, user);
            });
        });
    })
);

var app = express();

app.configure(function() {
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ secret: 'veryverysecretsecret' }));
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
    app.use(flash());
});

app.get(
    '/auth/google',
    passport.authenticate('google', { failureRedirect: '/login', failureFlash: true }),
    function (req, res) {
        res.redirect('/');
    }
);

app.get('/auth/google/return',
    passport.authenticate('google', { failureRedirect: '/login', failureFlash: true }),
    function (req, res) {
        res.redirect('/');
    }
);

http.createServer(app).listen(123456);

最佳答案

Passport 需要先配置 flash。

要解决您的问题,只需更改 app.configure() 中的顺序,并将 passport use 移到它下面,如下所示:

app.configure(function() {
    app.set('view engine', 'ejs');
    app.set('views', __dirname + '/views');
    app.use(express.logger());
    app.use(express.cookieParser());
    app.use(express.bodyParser());
    app.use(express.methodOverride());
    app.use(express.session({ secret: 'veryverysecretsecret' }));
    app.use(flash());
    app.use(passport.initialize());
    app.use(passport.session());
    app.use(app.router);
});

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

passport.deserializeUser(function (obj, done) {
    done(null, obj);
});

passport.use(new googleStrategy(
    { 
        returnURL: 'http://localhost:123456/auth/google/return', 
        realm: 'http://localhost:123456/' 
    },
    function(identifier, profile, done) {
        process.nextTick(function () {
            User.findOne({ ID: identifier }, function (err, user) {
                if (err) {
                    return done(err);
                }

                if (!user) {
                    return done(null, false, { message: 'no such user' });
                }

                return done(null, user);
            });
        });
    })
);

很高兴对您有所帮助!

关于node.js - 设置 connect-flash 中间件以供 passport 使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19984996/

相关文章:

node.js - node.js/express 中的代理请求

mysql - Ssequelizejs、MySQL 和 Passportjs user.findOne 不是函数

mongodb - Socket.io、Passport、MongoDB 和 Passport.socketio 在生产中损坏

javascript - 是否可以通过将对象的属性设置为未定义来删除该属性?

node.js - 无法连接到暴露的 Docker 容器端口上的 Node.js 检查器

javascript - 如何从 findOne() Mongoose 返回结果

javascript - MongoJS Node findOne 错误地没有返回结果

express - Passport.js 本地身份验证与 Express.js 4

javascript - Vue-Cookies 获取不到 Cookie

node.js - 哪个 hogan.js 模板包与 express.js 一起使用?