【问题标题】:How do I generate a session ID in Node.js?如何在 Node.js 中生成会话 ID?
【发布时间】:2014-10-14 01:27:52
【问题描述】:

我正在尝试在不使用任何第三方模块或框架的情况下学习 Node.js。我要弄清楚如何为登录的用户提供会话 ID...

到目前为止,我知道我可以通过在标题中写入会话 ID 来设置会话 ID,设置 cookie:

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

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

request.headers.cookie(request.url);

但是如何生成会话 ID 值?我是编程新手。我想到的第一件事是使用 Javascript 的 Math.random(); 并使用该值来设置 cookie ( session id )。在我看来,这感觉很愚蠢,但这是我能想到的。

我想如何使用 Node.js 生成会话 ID,没有第三方模块,请准系统!

【问题讨论】:

  • 这是一个很好的问题......请注意,您如何处理 cookie 中的会话 ID 具有很强的安全隐患。无论您做什么,都不要在生产环境中实现您构建的内容。您可以使用大量经过良好测试的现成代码。现在,您可以根据需要生成会话 ID。这真的不是 Node.js 问题。这是一个最佳实践和 JavaScript 问题。

标签: node.js cookies uniqueidentifier unique-key


【解决方案1】:

注意:您可能应该将会话管理器用于您使用的任何框架.. 无论是 connect、express、koa 还是其他任意数量的框架。


这将使用crypto.randomBytes 为您提供UUID version 4 (random)

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 module。虽然您可以使用 Browserify's crypto shim,但加密包不是浏览器内选项。

【讨论】:

  • 你能告诉我你在 uuidFromBytes 函数中使用了什么概念吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-30
  • 2015-04-03
  • 2012-08-12
  • 1970-01-01
  • 2013-03-24
  • 1970-01-01
  • 2012-06-24
相关资源
最近更新 更多