【问题标题】:Setting up connect-flash middleware for use by passport设置 connect-flash 中间件以供护照使用
【发布时间】:2013-11-27 21:31:27
【问题描述】:

我想访问我的护照策略在其回调中指定的消息,如下所示:done(null, false, { message: 'No such user.' });。到目前为止,我发现这些消息可以通过将选项failureFlash: true 传递给passport.authenticate() 函数来显示,再次使用需要安装connect-flash 中间件。所以我安装了模块并将var flash = require('connect-flash);添加到我的源中,以及app.use(flash());添加到我的快递应用程序的配置方法中。但它仍然会因方法 .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);

【问题讨论】:

  • 你在哪里使用.flash()
  • 我不是。不是明确的,就是这样。据我了解,重定向到失败路由时会被passport调用。
  • hmmm...你能发布更多来源吗?
  • 嗯,我想我可以。让我挑出相关的部分。
  • @JasonNichols 将 app.use(flash()) 向上移动确实有效,谢谢!将其添加为答案,好吗?

标签: node.js express passport.js


【解决方案1】:

Passport 需要先配置 flash。

要解决您的问题,只需更改app.configure() 中的顺序,并将护照用途移到其下方,如下所示:

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);
            });
        });
    })
);

很高兴它有帮助!

【讨论】:

    猜你喜欢
    • 2013-05-07
    • 2017-10-05
    • 2013-09-28
    • 2016-01-12
    • 2020-01-04
    • 2018-08-07
    • 2012-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多