Parse Server 登录 return 用户,但 req.user 未定义

Parse Server login return a user, but req.user is undefined

我正在尝试使用 Parse Server 设置一个简单的身份验证系统:

app.js

...

app.get('/login', (req, res) => {
    res.render('login.ejs');
});

app.post('/login', (req, res) => {
    console.log('POST /login\t' + util.inspect(req.body));
    driver.login(req, (err, user) => {
        //Here, user is defined
        if(err) {
            res.redirect('/login');
        } else {
            res.redirect('/user');
        }
    });
});

...

driver.js:

...

function login(req, callback) {
    var username = req.body.username,
        password = req.body.password;
    Parse.User.logIn(username, password, {
        success: (user) => {
            callback();
        },
        error: (user, error) => {
            callback(JSON.stringify(error));
        }
    });
}

function isLoggedIn(req, callback) {
    console.log('isLoggedIn?');
    console.log(util.inspect(req.user)); //undefined
    if(req.user) {
        callback();
    } else {
        callback('Not logged in');
    }
}

...

当我访问 /login 时,我可以正常登录,并且可以毫无错误地重定向到 /user,但是在 /user 上,它使用 isLoggedIn 作为中间件,req.user 未定义。

我看到其他人在搜索时遇到了同样的问题,但是 post 要么是旧的(<2015),要么是使用了 JSSDK 的另一部分(react/browser),要么就是没有得到任何答案。

我知道我可以使用 session,并且每次都基于它重新创建用户,但感觉真的很老套,这真的是受支持的方式吗?

您有两条路要走,要么有一个 REST-full 服务器,这意味着用户在路由调用、STATE-full 和使用会话之间不是持久的。

幸运的是,已经构建了一个非常好的 nodejs 身份验证中间件,它将处理所有这些会话管理。这称为 passportJS。可以在此处找到文档:http://passportjs.org/docs

您不仅可以通过本地登录进行身份验证,还支持使用 google、facebook、github 等进行身份验证。这是通过所谓的策略来完成的。您使用 google-strategy 获得 google oauth,facebook-stradegy 获得 facebook oauth,等等

您要寻找的是本地策略,之所以这样称呼是因为您想使用本地用户凭据进行身份验证。这个策略可以在这里找到:https://www.npmjs.com/package/passport-local

你需要护照和本地护照,安装简单 运行

npm install passport passport-local

从那里开始,只需阅读我上面链接的文档,了解如何设置所有内容。

开发我对 blablabla 评论的回答,谁问我最终使用了什么。

在我的例子中,我正在开发一个 REST API,会话数据预计不会在连接后发生变化。

所以我所做的是将会话委托给客户端,并通过使用 JWT 实现完全无状态。

当客户端通过身份验证后,我在 Json Web Token 中加密他的会话数据,然后发送给他。当他尝试访问受保护的页面时,他将 JWT 发给我,我可以解密它,并根据其中的信息重新创建 req.user

我的中间件是这样的:

function isLoggedIn(req, res, next) {
    //If there is a token
    if(req.headers != null && req.headers.token != null) {
        //Verify it and extract the user's data
        verify(req.headers.token, (err, user) => {
            if(err != null) {
                res.status(401);
                res.json({error: err});
            } else {
                //Recreate req.user
                req.user = user;
                next();
            }
        });
    } else {
        res.status(401);
        res.json({error: 'No token'});
    }
}

function verify(token, callback) {
    //Verify the token
    jwt.verify(token, jwtSecret, (error, user) => {
        if(error != null) {
            callback(error);
        } else {
            Separately check if logged into Parse
            parse.isLoggedIn(user, (error, loggedIn) => {
                if(error != null) {
                    callback(error);
                } else if(!loggedIn) {
                    callback('Not logged in the Parse');
                } else {
                    callback(null, user);
                }
            });             
        }
    });
}