【问题标题】:PassportJS - Getting back custom error message from Node server to clientPassportJS - 从节点服务器向客户端取回自定义错误消息
【发布时间】:2022-01-04 05:49:22
【问题描述】:

我在这里查看了几个类似的问题,但似乎没有一个回答我的具体问题。但我只是想在登录错误时回传一条自定义消息,但不知道如何获取它。

所以这是我的 passport.js 文件中的本地策略代码:

passport.use(
    new LocalStrategy((username, password, done) => {
        User.userSearch(username)
            .then((user) => {
                console.log({ user });
                if (!user.allow_login) {
                    // don't allow login, send back message
                    return done(null, false, {
                        message: 'Login disabled right now.',
                    });
                } else if (user?.password) {
                ...

然后是我的用户网关中的登录路由:

router.post(
    '/login',
    (req, res, next) => {
        if (req.isAuthenticated()) {
            req.session.touch();
        }
        next();
    },
    passport.authenticate('local', {
        failureRedirect: '/login',
        failureFlash: true,
    }),
    (req, res) => {
        console.log({ res });
        console.log({ req });
        // if you made it here, the user is real and authentic
        // check rememberMe and set cookie age accordingly
        if (req.body.rememberMe) {
            req.session.cookie.maxAge = 30 * 24 * 60 * 60 * 1000; // Cookie expires after 30 days
        } else {
            req.session.cookie.expires = false; // Cookie expires at end of session
        }
        // create new user object with email, customer name, and type

        const user = {
            email: req.user.email,
            type: req.user.type,
            first: req.user.first_name,
            last: req.user.last_name,
            filled_in: req.user.filled_in_basic_profile,
        };
        res.status(200).json({ user });
    }
);

我能找到的所有其他示例似乎在 passport.authenticate("local" 部分之后使用了不同的代码。我在客户端返回的只是 401。

**更新:** 如果有帮助,请在调用登录函数的地方添加客户端代码。

export const login = (user) => {
    return (
        axios
            // .post('/users/login', {
            .post(baseURL + '/users/login', {
                //.post(baseURL + '/auth/', {
                username: user.email,
                password: user.password,
                rememberMe: user.rememberMe
            })
            .then((res) => {
            ...

【问题讨论】:

  • 你能把你打电话给done(...)的其他代码行贴出来吗?

标签: node.js passport.js middleware


【解决方案1】:

您可以使用 express-flash 向客户端显示错误消息。

const flash = require('express-flash);
const session = require('express-session')
app.use(session({
  secret: 'hidden',
  cookie: {
      maxAge: 60000
 }
}))
app.use(flash());

所以现在将 flash 配置为中间件,您将可以访问 req.flash() 函数。您现在可以设置自定义 Flash 消息。

//route for passport strategy
router.post("/login", passport.authenticate("local", {
    failureRedirect: "/login",
    failureFlash: true,
}));
     
// render error to client
router.get("/error", function(req, res, next) {
return res.render("error", {
    error: req.flash("error"),
});
});
                                                                                      

在客户端,您将可以访问错误对象。 如果您使用的是 ejs,那么您可以这样做

<% if(typeof(error) != "undefined"){ %>
    <%= error %> 
<% } %>

您也可以像这样访问 locals.error

<%= locals.error %>

在反应中,您必须发出 axios 发布请求。在服务器端,您可以将响应作为对象发送。登录路径会是这样的

router.get('/login', passport.authenticate(//some code), (req, res) => {
    const error = req.flash('error') // check for empty variables
    res.json(error)// 
}) 

【讨论】:

  • 我已经用这些失败行更新了我的代码的第二块。但是,我不知道在哪里放置 // render error to client 代码。
  • 你的前端框架是什么。
  • 对于反应你应该看看这个stackoverflow.com/questions/49529959/…
  • 我使用的是 React,但不是 ejs。
  • 我只是对将代码放在// render error to client下的位置感到困惑
【解决方案2】:

我认为该代码可以正常工作。但是,我建议调试这部分:

user.allow_login

检查user.allow_loginif 之前是否实际上是false

【讨论】:

    猜你喜欢
    • 2017-04-08
    • 1970-01-01
    • 2015-04-17
    • 2017-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多