为节点 js 应用程序中的用户生成唯一的 api 密钥以访问您的 api

Posted

技术标签:

【中文标题】为节点 js 应用程序中的用户生成唯一的 api 密钥以访问您的 api【英文标题】:Generate unique api keys for user in node js application for access to your apis 【发布时间】:2021-01-03 07:11:57 【问题描述】:

如何根据数据库中用户的不同参数为您的 nodejs 应用程序的用户生成 API 密钥,以便访问我们的服务器端点。

【问题讨论】:

【参考方案1】:

当我们谈论生成 API 密钥时,我总是更喜欢使用 uuid 或加密库。 要保护您的密钥,请在将密钥保存到数据库之前对其进行加密。 要加密密钥,您可以使用 Google 的密钥管理服务 (KMS) 和 JWT,但我更喜欢使用 KMS。

【讨论】:

【参考方案2】:

您可以使用randomUUID,它是节点加密模块的一部分。然后你可以获取生成的 uuid,使用bcrypt 对其进行哈希处理并将其存储在 db 中。

const saltRounds = 10;
const token = crypto.randomUUID();
const hashedToken = await bcrypt.hash(token, saltRounds);

在随后的请求中,您可以像这样验证它:

const token = req.body.token // this is an example
bcrypt.compare(token, hashedToken, function(err, result) 
    // result == true
);

您还可以存储创建日期,并在令牌经过一定时间后使用它来使令牌失效。

哈希令牌可以保护它,以防恶意使用能够访问数据库。结合时间 和范围限制,您有一个非常可靠的解决方案。

【讨论】:

【参考方案3】:

您可以使用不同的参数生成 API 密钥并将其存储在数据库中以供不同的用户使用。

示例:

    您在数据库中有用户的用户名电子邮件。 将它们都添加以创建一个新字符串并将其存储在变量中 然后将其转换为Base64并存储在您的数据库中用户的apiKey列中。

代码

data = req.body.email+req.body.username;
let apiKey = Buffer.from(data).toString('base64')

使用此 API 密钥更新该用户的数据库列,用户可以使用该 API 密钥访问您的服务器端点。

【讨论】:

这是非常可预测的,请不要使用它。 我们可以保留数据中不为外界所知的任何值! 它可以被解码。请不要使用这个。也许计算一个哈希,然后做一个 Base 64,但这也不是太安全。 如果实现了,那么它可以很容易地逆转。您根本不应该包含与用户相关的数据,它应该由随机数字和大小写字母组成。此外,在存储它们时,您不应该以纯文本形式存储它们,您应该对它们进行哈希处理,这样如果数据库遭到破坏,API 密钥就会被哈希处理,并且不能在很长一段时间内使用。

以上是关于为节点 js 应用程序中的用户生成唯一的 api 密钥以访问您的 api的主要内容,如果未能解决你的问题,请参考以下文章

循环中的节点 JS 回调

多个 API 使用节点 js 生成一个数组/对象

js自动生成guid唯一id

节点js中的REST api,用于使用弹性搜索进行全文搜索

为节点js中的Socket.io中的特定用户发出事件

在 redux 应用程序中,在哪里为实体生成唯一 ID?