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

时间:2016-06-21 16:12:36

标签: 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) => {
        //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未定义。

我在搜索时看到其他人遇到同样的问题,但是旧帖子(< 2015),使用JSSDK的其他部分(反应/浏览器),或者只是没有得到任何答案。

我知道我可以使用session,并且每次都会根据它重新创建用户,但感觉非常hackish,它真的是受支持的方式吗?

1 个答案:

答案 0 :(得分:2)

您有两条路由可以使用REST-full服务器,这意味着用户在路由呼叫,STATE-full和使用会话之间不会持久。

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

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

您要寻找的是本地策略,这称为此策略,因为您希望使用本地用户凭据进行身份验证。可以在此处找到此策略:https://www.npmjs.com/package/passport-local

您需要本地护照和护照,并且只需安装

即可
npm install passport passport-local

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