使用节点生成API令牌

Mer*_*erc 19 node.js

我正在编写一个将公开API的应用程序.该应用程序允许人们创建工作区并向其添加用户.每个用户都有一个唯一的令牌.当他们进行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") );
Run Code Online (Sandbox Code Playgroud)

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

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

sae*_*eed 19

如果你使用mongodb只使用ObjectId,我推荐使用substack的hat模块.

生成id很简单

var hat = require('hat');

var id = hat();
console.log(id); // 1c24171393dc5de04ffcb21f1182ab28
Run Code Online (Sandbox Code Playgroud)

  • 我不认为使用mongodb的ObjectId是安全的.它有一些生成规则,并以某种方式基于时间.所以有人可以根据时间生成许多ObjectId并测试它们是否真的是令牌. (25认同)
  • 我也会避免使用ObjectId而是使用hat. (4认同)
  • Mongodb的ObjectID没有足够的熵.这里有关于MongoDB = http://stackoverflow.com/a/15436118/257082的更多细节.此外,在复制设置中使用MongoDB可能会导致应用程序逻辑出现挑战,需要足够随机的ObjectID (4认同)
  • 由于ObjectID推荐而被低估了.ObjectID是可预测的,低熵和泄漏信息,关于它们如何以及何时生成.根本不适合用作传统意义上的API密钥.有关更多信息,请参阅MongoDB文档:https://docs.mongodb.com/manual/reference/method/ObjectId/. (2认同)

Alf*_*red 6

这段代码如何确保您的令牌是唯一的?我相信你可以用这段代码碰撞数字.我相信你需要有一个序列号,就像在socket.io的这个提交中一样.

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

确保独特性.