首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在node.js中实现登录认证

如何在node.js中实现登录认证
EN

Stack Overflow用户
提问于 2011-11-03 14:07:24
回答 5查看 128.1K关注 0票数 77

我有一个正在运行的节点服务器:

var server=http.createServer(function(request, responsehttp) {
    if (request.method == 'POST') {
        var body = '';
        request.on('data', function (data) {
            body += data;
        });
        request.on('end', function () {
            var POST = qs.parse(body);
            processquery(POST, request, responsehttp);
        });
    } else {
        var url_parts = url.parse(request.url, true);
        var query = url_parts.query;
        console.log(query);
        processquery(query, request, responsehttp);
    }
});

我想添加此服务器.so的登录表单,当用户通过身份验证时,它将显示。

   function processquery(query, request, responsehttp){
    var returnResult = function (data){
        responsehttp.end(JSON.stringify(data));
    };

    if (!query.command) {
        fileprocess(request, responsehttp);
    }
    responsehttp.writeHead(200, {"Content-Type": "application/json"});
    switch(query.command) {
        case 'logout':
            logout(query, returnResult);
            break;
        case 'login':
            login(query, returnResult);
            break;
    }    
}

在查询函数中,如果没有给出任何命令,则将文件返回给客户端,这样我就可以将登录命令从客户端发送到服务器端,但是服务器端在接收到带有用户名密码的登录命令时应该怎么做,它应该如何处理登录请求并返回登录成功或失败,为了编写这一部分,我需要帮助。

我试过的。

function login(request, callback) {
    if(request.username==users[request.username] && request.password==users[request.username].password) {
        users[request.username].auth=true;
        var data = {result:'success','message':'login successful'};
        callback(data);
    } else {
        var data = {result:'error','message':'login incorrect'};
        callback(data);
    }
}

请建议如何在此添加会话,我尝试在登录函数中添加请求变量,并尝试设置request.session变量,它显示request.session未定义。

请建议我如何编写此登录模块,以便为每个用户正确维护登录身份验证。

EN

回答 5

Stack Overflow用户

发布于 2011-11-03 17:58:42

实际上,这不是问题的真正答案,但这是一种更好的方法。

我建议您使用connect/express作为http服务器,因为它们为您节省了大量时间。你显然不想重新发明轮子。在您的情况下,使用connect/express会话管理要容易得多。

除此之外,为了进行身份验证,我建议您使用everyauth。它支持很多身份验证策略。对于快速开发来说太棒了。

所有这一切都可以很容易地从他们的文档中复制粘贴下来!

票数 6
EN

Stack Overflow用户

发布于 2017-05-05 15:38:06

@alessioalex answer是一个完美的新节点用户演示。但不管怎样,除了登录之外,很难将checkAuth中间件写到所有路由中,所以最好使用app.use将checkAuth从每个路由移动到一个条目。例如:

function checkAuth(req, res, next) {
  // if logined or it's login request, then go next route
  if (isLogin || (req.path === '/login' && req.method === 'POST')) {
    next()
  } else {
    res.send('Not logged in yet.')
  }
}

app.use('/', checkAuth)
票数 2
EN

Stack Overflow用户

发布于 2018-08-20 06:35:59

我试过这个答案,但它对我不起作用。我也是web开发的新手,上过mlab的课,但我更喜欢解析,这就是为什么我必须寻找最合适的解决方案的原因。这是我目前在expressJS上使用parse的解决方案。

1)检查用户是否通过了身份验证:我有一个名为isLogginIn的中间件函数,我在每个需要对用户进行身份验证的路由上使用它:

 function isLoggedIn(req, res, next) {
 var currentUser = Parse.User.current();
 if (currentUser) {
     next()
 } else {
     res.send("you are not authorised");
 }
}

我在我的路由中使用这个函数,如下所示:

  app.get('/my_secret_page', isLoggedIn, function (req, res) 
  {
    res.send('if you are viewing this page it means you are logged in');
  });

2)登录路由:

  // handling login logic
  app.post('/login', function(req, res) {
  Parse.User.enableUnsafeCurrentUser();
  Parse.User.logIn(req.body.username, req.body.password).then(function(user) {
    res.redirect('/books');
  }, function(error) {
    res.render('login', { flash: error.message });
  });
});

3)注销路由:

 // logic route
  app.get("/logout", function(req, res){
   Parse.User.logOut().then(() => {
    var currentUser = Parse.User.current();  // this will now be null
    });
        res.redirect('/login');
   });

这对我来说非常有效,我完整地参考了这里的文档https://docs.parseplatform.org/js/guide/#users

感谢@alessioalex的回答。我只是更新了最新的实践。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7990890

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档