如何在PassportJS / Express内部错误后重定向?

时间:2015-07-24 02:34:49

标签: javascript node.js express passport.js

使用Express和NodeJS配置护照时,如果用户的电子邮件地址无效,我会抛出错误。出现此错误后,我想重定向到失败页面,向他们提供有关如何正确登录的说明。有没有更好的方法来做到这一点?如果没有,我将如何以某种方式捕获错误并重定向到新页面。

passport.use(new GoogleStrategy({
        clientID     : auth.googleAuth.clientID,
        /* Settings redacted for brevity */
    },
    function(token, refreshToken, profile, done) {
        User.findOne(
            {
                "google.id" : profile.id
            },
            function(err, user) {

                if (err) return done(err)

                if (user) return done(null, user)

                else {

                    if (email.indexOf("lsmsa.edu") > -1) {

                        // Code redacted for brevity

                    } else {
                        done(new Error("Invalid email address"))
                    }
                }
            }
        )
    }))

2 个答案:

答案 0 :(得分:3)

注意:我非常喜欢BlackMamba的回答,添加自定义回调/重定向是一个完全可以接受的选项。

只需将自己的错误处理中间件添加到Express:

passport.use(new GoogleStrategy({
    clientID     : auth.googleAuth.clientID,
    /* Settings redacted for brevity */
},
function(token, refreshToken, profile, done) {
    User.findOne({
            "google.id" : profile.id
        },
        function(err, user) {

            if (err) return done(err)

            if (user) return done(null, user)

            else {

                if (email.indexOf("lsmsa.edu") > -1) {

                } else {
                    // Throw a new error with identifier:
                    done(throw {
                        type: "invalid_email_address", 
                        code: 401, 
                        profileId: profile.id
                    }));
                }
            }
        }
    )
}));

// The error handling middleware:

app.use(function(e, req, res, next) {
    if (e.type === "invalid_email_address") {
        res.status(e.code).json({
            error: {
                msg: "Unauthorized access", 
                user: e.profileId
            }
        });
    }
});

你会注意到我用一个更强大的错误组合修改了这个答案。我已经定义了错误的code属性以匹配适用的HTTP状态代码 - 在这种情况下,401

// callback
done(throw {
    // just a custom object with whatever properties you want/need
    type: "invalid_email_address",
    code: 401, 
    profileId: profile.id
}));

在错误处理中,我们只需检查类型是invalid_email_address(您可以随意创建它,但它应该在您的应用程序中保持一致)然后使用“代码”将错误写出来HTTP状态代码:

          // e is the error object, and code is the custom property we defined
res.status(e.code).json({
    error: {
        msg: "Unauthorized access",
        user: e.profileId
    }
});

这是一个包含重定向的自包含工作示例:

var express = require('express');
var app = express();

app.all('*', function(req, res) {
    throw {type: "unauthorized", code: 401}
})

app.use(function(e, req, res, next) {
    console.log(e);
    if (e.code === 401) {
        res.redirect("/login")
    } else {
        res.status(500).json({error: e.type});
    }
});

app.listen(9000);

答案 1 :(得分:3)

我认为你可以使用它:

  

重定向

     

重定向通常在验证请求后发出。

app.post('/login',
  passport.authenticate('local', { successRedirect: '/',
                                   failureRedirect: '/login' }));
  

在这种情况下,重定向选项会覆盖默认行为。上   验证成功后,用户将被重定向到家中   页。如果身份验证失败,用户将被重定向回到   另一次尝试的登录页面。

或者这个:

  

自定义回叫

     

如果内置选项不足以处理   身份验证请求,可以提供自定义回调以允许   申请成功或失败。

app.get('/login', function(req, res, next) {
  passport.authenticate('local', function(err, user, info) {
    if (err) { return next(err); }
    if (!user) { return res.redirect('/login'); }
    req.logIn(user, function(err) {
      if (err) { return next(err); }
      return res.redirect('/users/' + user.username);
    });
  })(req, res, next);
});

请阅读文件: http://passportjs.org/docs/authenticate