如何在node.js中实现登录身份验证

问题描述 投票:73回答:5

我有这个节点服务器运行:

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);
    }
});

我想为此服务器添加登录表单。所以当用户通过身份验证后会显示。

   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;
    }    
}

在进程查询函数中,如果没有给出任何命令,则将文件返回给客户端,所以我可以从客户端向服务器发送login命令,但是当用户名密码接收登录命令时应该做什么服务器,应该如何处理登录请求并返回登录成功或失败,写这部分我需要帮助。

我试过的。

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未定义。

请建议我如何编写这个可以为每个用户正确维护登录认证的登录模块。

authentication node.js login
5个回答
239
投票

这是我用Express.js做的方式:

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

function checkAuth(req, res, next) {
  if (!req.session.user_id) {
    res.send('You are not authorized to view this page');
  } else {
    next();
  }
}

我在我的路线中使用此功能,如下所示:

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

2)登录路线:

app.post('/login', function (req, res) {
  var post = req.body;
  if (post.user === 'john' && post.password === 'johnspassword') {
    req.session.user_id = johns_user_id_here;
    res.redirect('/my_secret_page');
  } else {
    res.send('Bad user/pass');
  }
});

3)退出路线:

app.get('/logout', function (req, res) {
  delete req.session.user_id;
  res.redirect('/login');
});      

如果你想了解更多关于Express.js的信息,请查看他们的网站:expressjs.com/en/guide/routing.html如果需要更复杂的东西,请查看everyauth(它有很多auth方法可用,适用于facebook,twitter等;有很好的教程here)。


6
投票

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

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

除了认证之外,我建议你使用everyauth。其中支持很多身份验证策略。快速发展令人敬畏。

所有这一切都可以通过文档中的一些副本粘贴轻松下来!


3
投票

要添加到Farid的伪答案,

考虑在Passport.js上使用everyauth

this question的答案为这些差异提供了一些见解。


将用户身份验证卸载到Google,Facebook或其他网站有很多好处。如果您的应用程序的要求使您可以将Passport用作您的唯一身份验证提供程序,或者与传统登录一起使用,则可以使您的用户更轻松地体验。


2
投票

@alessioalex答案是新节点用户的完美演示。但无论如何,除了登录之外,很难将checkAuth中间件写入所有路由,因此最好将checkAuth从每个路由移动到app.use的一个条目。例如:

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)

1
投票

我尝试了这个答案,它对我不起作用。我也是网络开发的新手,并参加了我使用mlab的课程,但我更喜欢解析,这就是为什么我必须寻找最合适的解决方案。这是我自己当前使用expressJS解析的解决方案。

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的回答。我只更新了最新的做法。

© www.soinside.com 2019 - 2024. All rights reserved.