使用节点生成API令牌

我正在编写一个将公开API的应用程序。 该应用程序允许人们创build工作区并向其添加用户。 每个用户将有一个唯一的令牌。 当他们进行API调用时,他们将使用该标记(这将标识为使用该工作空间的用户)。

目前我正在这样做:

var w = new Workspace(); // This is a mongoose model w.name = req.body.workspace; w.activeFlag = true; crypto.randomBytes(16, function(err, buf) { if(err){ next(new g.errors.BadError503("Could not generate token") ); } else { var token = buf.toString('hex'); // Access is the list of users who can access it. NOTE that // the token is all they will pass when they use the API w.access = { login: req.session.login, token:token, isOwner: true }; w.save( function(err){ if(err){ next(new g.errors.BadError503("Database error saving workspace") ); 

这是生成API令牌的好方法吗?

由于令牌是名称+工作区,也许我应该做一些像md5(用户名+工作区+ secret_string)…?

如果你使用的是mongodb只是使用ObjectId,那么我推荐使用这个模块。

生成id很简单

 var hat = require('hat'); var id = hat(); console.log(id); // 1c24171393dc5de04ffcb21f1182ab28 

这段代码如何确保您的令牌是唯一的? 我相信你可能会碰到这个代码的数字。 我相信你需要有一个像socket.io这个提交的序列号。

你也可以使用npm项目,例如:

  • UUIID (v4)
  • 帽子

保证唯一性。

为什么不只是使用UUIDv4,如果你正在寻找一些独特的东西? 如果你对其他types的哈希(如前面提到的帽子是一个不错的select)感兴趣,你可以看看speakeasy – https://github.com/markbao/speakeasy 。 它不仅可以生成随机密钥,而且还可以创build基于时间的双因素身份validation密钥,如果您真的想要增加额外的安全强度。

我认为以下是生成API令牌的最佳解决scheme

  • JWT(Jsonnetworking令牌)
  • Speakeasy – 这会根据基于时间的双重身份validation(例如google authenticator)生成令牌

Speakeasy更安全,因为这个密钥只有一小段时间(例如30秒)