使用节点生成API令牌

时间:2012-08-27 03:05:38

标签: 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") );

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

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

4 个答案:

答案 0 :(得分:18)

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

生成id很简单,如

var hat = require('hat');

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

答案 1 :(得分:5)

此代码如何确保您的令牌是唯一的?我相信你可以用这段代码碰撞数字。我相信你需要有一种类似in this commit from socket.io的序列号。

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

确保唯一性。

答案 2 :(得分:3)

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

Speakeasy更安全,因为此密钥仅在很短的时间内可用(例如,30秒)

答案 3 :(得分:1)

如果您正在寻找独特的东西,为什么不使用UUIDv4?如果你对其他类型的哈希感兴趣(如前面提到的帽子是一个很好的选择),你可能会看看speakeasy - https://github.com/markbao/speakeasy。它不仅可以生成随机密钥,还可以创建基于时间的twofactor身份验证密钥,如果您真的想要在额外的安全强度上进行分层。