提问人:Merc 提问时间:8/27/2012 最后编辑:Alexis TylerMerc 更新时间:9/13/2021 访问量:36569
使用 node 生成 API 令牌
Generating API tokens using node
问:
我正在编写一个将公开 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) ...?
答:
7赞
Alfred
8/27/2012
#1
此代码如何确保令牌是唯一的?我相信你可以用这个代码来碰撞数字。我相信你需要有一种序列号,就像 socket.io 的这个提交一样。
您也可以使用 npm 项目,例如:
以确保唯一性。
评论
1赞
Ryan Shillington
9/13/2021
令我惊讶的是,UUID 包(仅限 v4!)在加密上是安全的。但我查了一下。是的。很酷。
21赞
saeed
8/27/2012
#2
如果您使用 mongodb 只使用 ObjectId,那么我推荐 substack 的 hat 模块。
生成 id 很简单,因为
var hat = require('hat');
var id = hat();
console.log(id); // 1c24171393dc5de04ffcb21f1182ab28
评论
27赞
Bin Wang
6/26/2014
我认为使用 mongodb 的 ObjectId 是不安全的。它有一些规则可以生成,并且以某种方式基于时间。因此,有人可以根据时间生成许多 ObjectId,并测试它们是否真的是代币。
4赞
Pepijn
7/16/2014
我也会避免使用 ObjectId 并改用 hat。
0赞
David Novák
9/13/2015
我建议仅在数据库中存储该令牌的哈希值,您不能使用 ObjectId 来执行此操作。
4赞
ice.nicer
3/30/2017
Mongodb 的 ObjectID 没有足够的熵。以下是有关 MongoDB = stackoverflow.com/a/15436118/257082 的更多详细信息。此外,在复制设置中使用 MongoDB 可能会导致应用程序逻辑出现挑战,需要足够随机的 ObjectID
2赞
Ben Elgar
9/26/2017
由于 ObjectID 建议而被否决。ObjectID 是可预测的、低熵的,并且会泄漏有关其生成方式和时间的信息。完全不适合用作传统意义上的 API 密钥。有关更多信息,请参阅 MongoDB 文档:docs.mongodb.com/manual/reference/method/ObjectId。
1赞
AlexGad
8/28/2012
#3
如果您正在寻找独特的东西,为什么不直接使用 UUIDv4?如果你对其他类型的哈希感兴趣(如前所述,帽子是一个不错的选择),你可以看看地下酒吧 - https://github.com/markbao/speakeasy。它不仅可以生成随机密钥,还可以创建基于时间的双因素身份验证密钥,如果您真的想增加额外的安全强度。
4赞
Libu Mathew
9/8/2016
#4
我认为以下是生成 API 令牌的最佳解决方案
- JWT(Json Web 令牌)
- Speakeasy - 这基于基于时间的双因素身份验证(如谷歌身份验证器)生成令牌
Speakeasy 更安全,因为此密钥仅在很短的时间段内可用(例如,30 秒)
评论