为节点 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的主要内容,如果未能解决你的问题,请参考以下文章