我们如何在Web应用程序中进行身份验证?

时间:2011-06-19 13:24:48

标签: session authentication node.js session-cookies

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

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

这就是我得到的:

  1. 我们检查用户并从中传递 数据库中的POST数据
  2. 如果正确,我们会为客户端提供一个新会话,并将其保存在数据库中。
  3. 客户端将会话保存为cookie,并在每个页面请求中发送。
  4. 服务器检查会话并提供给用户的内容。
  5. 这是我不知道的部分:

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

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

1 个答案:

答案 0 :(得分:3)

  • 会话只是与对象/阵列关联的唯一键(会话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);