如何在node.js中实现loginauthentication

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

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

我想为此服务器添加login表单。当用户通过身份validation时,它会显示。

  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命令从客户端发送到服务器,但是当接收到带有用户名密码的login命令时,服务器应该执行什么操作,应该如何处理login请求并返回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); } } 

请build议如何添加会话在这个我试图添加,请求variablesloginfunction,并尝试设置request.sessionvariables它说request.session是未定义的。

请build议如何编写这个login模块,它可以为每个用户正确维护login身份validation。

以下是我如何使用Express.js完成的操作 :

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

 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) login路线:

 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等等;在这里好教程)。

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

我build议你使用connect / express作为http服务器,因为它们为你节省了大量的时间。 你显然不想重新发明轮子。 在你的情况下,连接/快速会话pipe理更容易。

除了身份validation,我build议你使用everyauth 。 这支持很多authentication策略。 令人敬畏的快速发展。

所有这一切都可以轻松地从他们的文档粘贴一些副本!

为了增加Farid的伪答案,

考虑使用Passport.js over Everyauth 。

这个问题的答案提供了一些洞察力的差异。


将用户身份validation卸载到Google,Facebook或其他网站有很多好处。 如果您的应用程序的要求是您可以使用Passport作为您唯一的身份validation提供程序,或与传统login一起使用,则可以使您的用户更容易使用体验。

@alessioalex答案是新鲜节点用户的完美演示。 但无论如何,很难将checkAuth中间件写入除login之外的所有路由,所以最好将每个路由的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)