设置供护照使用的Connect-Flash中间件 [英] Setting up connect-flash middleware for use by passport

查看:111
本文介绍了设置供护照使用的Connect-Flash中间件的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

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

I want to access the message that my passport strategy specifies in its callback, like this: done(null, false, { message: 'No such user.' });. I found out so far that these messages can be displayed by passing the option failureFlash: true into the passport.authenticate() function, the usage of which again requires connect-flash middleware to be installed. So I installed the module and added var flash = require('connect-flash); to my source, as well as app.use(flash()); to the configuration method of my express app. But it still crashes with the error that a method .flash() is not available. What did I miss?

更多代码:

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

推荐答案

护照需要先配置闪存.

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

To fix your problem, just change the order in app.configure(), and move the passport use below it, like so:

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

很高兴!

这篇关于设置供护照使用的Connect-Flash中间件的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆