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

fumotvh3  于 2022-12-18  发布在  Node.js
关注(0)|答案(2)|浏览(136)

当使用Express和NodeJS配置passport时,如果用户有无效的电子邮件地址,我会抛出一个错误。在这个错误之后,我想重定向到一个失败页面,告诉他们如何正确登录。有没有更好的方法来做到这一点?如果没有,我将如何以某种方式捕捉错误并重定向到一个新的页面。

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"))
                    }
                }
            }
        )
    }))
uz75evzq

uz75evzq1#

我想你可以用这个:
重定向
重定向通常在验证请求之后发出。

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

请阅读文档:https://www.passportjs.org/concepts/authentication/downloads/html/#middleware

fhity93d

fhity93d2#

  • 注意:* 我也很喜欢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
            }
        });
    }
});

您会注意到我用一个更健壮的错误组合对这个答案做了一些修改。

// 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(您可以随意设置,但应在应用中保持一致),然后使用“code”作为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);

相关问题