19

我正在编写一个将公开 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(username+workspace+secret_string) ...?

4

4 回答 4

19

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

生成 id 很简单

var hat = require('hat');

var id = hat();
console.log(id); // 1c24171393dc5de04ffcb21f1182ab28
于 2012-08-27T03:41:09.313 回答
7

此代码如何确保您的令牌是唯一的?我相信您可能会与此代码发生数字冲突。我相信你需要有一种序列号,就像来自 socket.io 的这个提交一样。

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

以确保唯一性。

于 2012-08-27T03:16:06.997 回答
4

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

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

于 2016-09-08T05:53:17.457 回答
1

如果您正在寻找独特的东西,为什么不直接使用 UUIDv4?如果您对其他类型的哈希感兴趣(如前所述,这是一个不错的选择),您可以查看 speakeasy - https://github.com/markbao/speakeasy。它不仅会生成随机密钥,而且如果您真的想增加额外的安全强度,它还可以创建基于时间的双因素身份验证密钥。

于 2012-08-27T18:32:15.547 回答