在Node.js中如何生成会话ID?

7

我正在尝试学习Node.js,而不使用任何第三方模块或框架。现在我需要解决一个问题,给登录用户分配会话ID。

到目前为止,我知道可以通过编写头文件并设置cookies来设置会话ID:

writeHead(200, {'set-cookie':'Math.random() ' } );

然后我可以获取会话ID,稍后将其与数据库进行比较。

request.headers.cookie(request.url);

如何生成会话 ID 值?我是个编程新手。我首先想到的是使用 Javascript 的 Math.random(); 函数生成一个值,然后将该值用作 cookie(会话 ID)的设置。在我的脑海中,这种方法似乎很愚蠢,但这已经是我所能想到的了。

请问如何在 Node.js 中生成会话 ID,不使用第三方模块,只使用基本工具?


这是一个很好的问题...只要注意在处理cookie中的会话ID时存在强烈的安全影响。无论你做什么,都不要在生产环境中实现你构建的东西。有很多经过充分测试的现成代码可以使用。现在,你可以按任何方式生成你的会话ID。这并不是一个Node.js的问题。这是一个最佳实践和JavaScript的问题。 - Brad
1个回答

5
注意:无论您选择哪个框架,都应该使用会话管理器。可以是connect、express、koa或其他任何框架。
这将使用 crypto.randomBytes 生成一个 UUID版本4(随机)
var crypto = require('crypto');
module.exports = genUuid;

function genUuid(callback) {
  if (typeof(callback) !== 'function') {
    return uuidFromBytes(crypto.randomBytes(16));
  }

  crypto.randomBytes(16, function(err, rnd) {
    if (err) return callback(err);
    callback(null, uuidFromBytes(rnd));
  });
}

function uuidFromBytes(rnd) {
  rnd[6] = (rnd[6] & 0x0f) | 0x40;
  rnd[8] = (rnd[8] & 0x3f) | 0x80;
  rnd = rnd.toString('hex').match(/(.{8})(.{4})(.{4})(.{4})(.{12})/);
  rnd.shift();
  return rnd.join('-');
}

你也可以使用来自npm的UUID模块。虽然crypto包不适用于浏览器,但你可以使用Browserify的crypto shim

你能告诉我在uuidFromBytes函数中使用了哪个概念吗? - piku_baba
UUID和v4有要求,某些字节必须包含特定的值。它接收完整结果的字节,进行微调以确保保留字段的值,并组装字符串... 它匹配转换后的十六进制结果的块,并从那里将结果连接在一起。移位操作将完整结果从各个部分中移除。 - Tracker1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接