会话如何在Express.js中与Node.js一起工作?

时间:2011-04-02 08:09:59

标签: javascript node.js session cookies express

使用Express.js,会话很简单。我很好奇他们实际上是如何工作的。

它是否在客户端存储了一些cookie?如果是这样,我在哪里可以找到该cookie?如果需要,我该如何解码呢?

我基本上希望能够查看用户是否已登录,即使当时用户实际上并不在网站上(例如,当您在其他网站上时,facebook知道您已登录)。但我想要明白,我应该先了解会议的运作方式。

4 个答案:

答案 0 :(得分:153)

概述

Express.js使用cookie在用户的浏览器中存储会话ID(带有加密签名),然后在后续请求中使用该cookie的值来检索存储在服务器上的会话信息。此服务器端存储可以是内存存储(默认)或实现所需方法的任何其他存储(如connect-redis)。

详细

Express.js / Connect使用utils.uid(24)创建一个24个字符的Base64字符串,并将其存储在req.sessionID中。然后将此字符串用作cookie中的值。

客户端

签名的cookie总是用于会话,因此cookie值将具有以下格式。

[sid].[signature]

其中[sid]是sessionID,[signature]是通过使用初始化会话中间件时提供的密钥签署[sid]生成的。 签名步骤是为了防止篡改。在不知道所使用的密钥的情况下修改[sid]然后重新创建[签名]在计算上是不可行的。如果不需要修改[sid],会话cookie仍然容易被盗和重用。

此Cookie的名称是

connect.sid

服务器端

如果在cookieParsersession中间件之后发生处理程序,它将有权访问变量req.cookies。它包含一个JSON对象,其键是cookie键,值是cookie值。这将包含名为connect.sid的密钥,其值将是已签名的会话标识符。

这是一个如何设置路由的示例,该路由将检查每个请求上是否存在会话cookie,并将其值打印到控制台。

app.get("/*", function(req, res, next) {

    if(typeof req.cookies['connect.sid'] !== 'undefined') {
        console.log(req.cookies['connect.sid']);
    }

    next(); // Call the next middleware
});

您还需要确保在配置部分app.use(app.router)cookieParser之后包含路由器(session)。

以下是Express.js / Connect内部存储的数据示例。

{
  "lastAccess": 1343846924959,
  "cookie": {
    "originalMaxAge": 172800000,
    "expires": "2012-08-03T18:48:45.144Z",
    "httpOnly": true,
    "path": "/"
  },
  "user": { 
    "name":"waylon",
    "status":"pro"
  }
}

user字段是自定义的。其他一切都是会话管理的一部分。

示例来自Express 2.5。

答案 1 :(得分:37)

我从来没有使用过Express.js,虽然根据their documentation关于这个主题听起来像是:

  • Cookie存储在客户端上,带有密钥(服务器将用于检索会话数据)和散列(服务器将使用该散列来确保cookie数据未被篡改,因此,如果您尝试更改值,则cookie将无效)

  • 会话数据,而不是某些框架(例如Play Framework!)保存在服务器上,因此cookie更像是会话的占位符而不是实际会话数据的持有者。 / p>

  • here开始,服务器上的会话数据默认保存在内存中,尽管可以将其更改为实现相应API的任何存储形式。

因此,如果您想检查没有特定req请求对象的内容,就像您说的那样,您只需访问相同的存储空间即可。在第一个文档页面的底部,它详细说明了存储需要实现的所需方法,因此,如果您熟悉存储API,那么如果存在这样的情况,您可以执行.getAll()并循环执行会话数据并读取您想要的任何值。

答案 2 :(得分:8)

  

我很好奇他们实际上是如何工作的。

尝试查看this回答和wiki内容。

  

它是否在客户端存储了一些cookie?

是的,它通常是一个带有指定会话ID的cookie,应该用秘密签名以防止伪造。

  

如果是这样,我在哪里可以找到该cookie?如果需要,我该如何解码呢?

您不应该在客户端混淆会话cookie。如果您想在服务器端使用会话,则应查看相关的express.jsconnect文档。

答案 3 :(得分:0)

除了已经非常好的答案之外,这里还有两个我用来解释Express会话的图表,它们与cookie和store的链接:

  • 巧克力曲奇: chocolate
  • 草莓饼干: strawberry