【问题标题】:How do we do authentications in web applications?我们如何在 Web 应用程序中进行身份验证?
【发布时间】:2011-09-18 03:47:07
【问题描述】:

对不起,我写了很多来解释我的情况,如果您没有时间或没有心情阅读所有这些内容,请跳至问题。即使回答其中一个也有助于我的情况,谢谢 :D

我正在尝试在 node.js 中编写一个 web 应用程序,但是由于我对 web 太陌生,我不知道如何编写 web 登录系统。我不想使用基本或摘要式 http 身份验证,我希望它像具有 http 表单的普通登录系统一样,并且不同的页面为不同类型的用户显示不同的内容。我搜索了一下,我知道基础知识,但还不够。

这是我得到的:

  1. 我们检查用户并从 POST 数据库中的数据
  2. 如果正确,我们会为客户端提供一个新会话,并将其保存在数据库中。
  3. 客户端将会话保存为 cookie 并在每个页面请求中发送。
  4. 服务器检查会话并为用户提供预期的内容。

这是我不知道的部分:

  • 我们如何生成会话?
  • 我们如何将其发送给客户?
  • 它是如何保存在 cookie 中的?
  • 什么时候到期?
  • 如果过期会怎样?什么 我们应该怎么做?
  • 还有什么我应该做的吗 知道吗?

如果可以的话,请给我一些节点中的例子。
提前谢谢你:D

【问题讨论】:

  • 请不要为网站编写自己的登录系统。您可以这样做来学习,但我现在要告诉您,您的网站将非常不安全。你应该使用github.com/bnoguchi/everyauth 之类的东西,它使用 facebook、twitter、google 等第三方来为你处理身份验证。他们配备了安全专家,他们知道如何保存系统以及在受到威胁时该怎么做。

标签: session authentication node.js session-cookies


【解决方案1】:
  • 会话只是与对象/数组关联的唯一键(会话 ID),这样您就可以将数据连接到您网站的用户。
  • 您将会话 ID 作为 cookie 发送给客户端,一旦发送,客户端会在每个 HTTP 请求中将其会话 ID 发送给您的服务器。
  • 您发送 HTTP Set-Cookie 标头 (Set-Cookie: sessionid=abcdefg38974)。
  • 您可以在需要时、浏览器关闭时或一年后使其过期(这将使您保持登录状态一年,之后您必须再次登录)。
  • 当 cookie 过期时,它会被丢弃,在服务器端它看起来就像用户还没有设置会话 ID,所以他必须重新登录。
  • 您应该知道诸如会话劫持(窃取他人的会话 ID)之类的事情。看看吧。

小例子,它可能会在您每次请求时创建两次访问号码,因为您的浏览器也请求/favicon.ico。请记住,此示例不是很安全,因为会话劫持是可能的,这也会将所有会话保留在内存中,并在服务器重新启动时忘记它们。将会话保存到数据库是明智的。

var http = require('http');

var sessions = {};
http.createServer(function (req, res) {

    var ssid;
    var session;

    if (req.headers.cookie) {
        // Cookie already set, read it
        var parts = req.headers.cookie.split('=');
        ssid = parts[1];

        // Is the session id known to us?
        if (typeof(sessions[ssid]) != "undefined") {
            session = sessions[ssid];

            console.log('Loaded session with id ' + ssid);
        }
    }

    if (typeof(session) == "undefined") {
        // No cookie set, make one
        ssid = Math.random();
        session = {
            'visitNumber': 0
        }

        console.log('Created session with id ' + ssid);
    }

    session.visitNumber++;

    // Respond to the browser
    res.writeHead(200, {
        'Content-Type': 'text/plain',
        'Set-Cookie': 'ssid=' + ssid
    });

    res.end('Visit number: ' + session.visitNumber + '\n');

    // Save the changes we have made to the session data
    sessions[ssid] = session;

}).listen(8080);

【讨论】:

    猜你喜欢
    • 2017-03-03
    • 1970-01-01
    • 2019-02-12
    • 2014-01-15
    • 1970-01-01
    • 2017-05-06
    • 2020-11-16
    • 1970-01-01
    • 2010-09-12
    相关资源
    最近更新 更多