Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 解析服务器登录返回用户,但req.user未定义_Javascript_Node.js_Express_Parse Server - Fatal编程技术网

Javascript 解析服务器登录返回用户,但req.user未定义

Javascript 解析服务器登录返回用户,但req.user未定义,javascript,node.js,express,parse-server,Javascript,Node.js,Express,Parse Server,我正在尝试使用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) =&

我正在尝试使用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
是未定义的


我见过其他人在搜索时也有同样的问题,但帖子中要么是old(你有两条路由要走,要么是REST full服务器,这意味着用户在路由调用、状态完全和使用会话之间不会持久

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

您不仅可以通过本地登录进行身份验证,还可以支持使用google、facebook、github等进行身份验证。这是通过所谓的策略实现的。您可以使用google策略创建google oauth,使用facebook stradegy创建facebook oauth等

您需要的是一种本地策略,之所以称为此策略,是因为您希望使用本地用户凭据进行身份验证。此策略可在此处找到:

您将需要passport和passport local,只需运行即可安装

npm install passport passport-local

从这里开始,只需浏览我在上面链接的文档,了解如何设置所有内容。

我对Bla comment的回答,他问我最终使用了什么

在我的例子中,我正在开发一个RESTAPI,会话数据在连接后不会改变

因此,我所做的是将会话委托给客户机,并通过使用完全无状态

当客户端经过身份验证时,我会在Json Web令牌中加密他的会话数据,并发送给他。当他尝试访问受保护的页面时,他会发送JWT给我,我可以解密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);
                }
            });             
        }
    });
}

我知道passport,问题是在身份验证之后,我想使用Parse,所以passport不是一个真正的解决方案。@DrakaSAN您最终是如何解决这个问题的?您是按照建议使用Passeport还是有更好的做法?我的情况完全相同。@bla:作为答案发布:)DrakaSAN-您希望如何在会话中支持会话和存储数据?正如@sookool99所提到的,您还需要一个抽象层。