我最近发现自己需要为我的应用程序开发公共API。我使用node.js
和mongodb
开发了我的应用程序。经过研究,我决定使用jwt
来生成用于用户和身份验证的API密钥。为了认证jwt
令牌,它们的优点是无需将它们存储在数据库中,因为可以在不知道确切生成的令牌的情况下对它们进行解码和验证。
但是我看到很多应用程序在应用程序仪表板中向用户显示其API密钥,因此我需要实际存储令牌,以便以后将它们显示给用户。我知道存储令牌是一个坏主意,如果数据库遭到破坏,它可能会让黑客利用API密钥来冒充他人。
长话短说,我试图找到一种方法来不存储确切的令牌,而是仅将有效负载存储在数据库中,并且每次用户请求其API密钥时,我都会使用 SECRET生成相同的密钥并将其传递给他们。我目前发现,如果在签名令牌步骤中,每次都传递相同的有效载荷和相同的iat
(在发出),则每次生成的令牌都将相同。因此,通过将iat
与有效载荷数据保存在数据库中,我可以每次生成确切的令牌。
这是我的mongoose
模式:
var KeySchema = new mongoose.Schema({
name: { type: String, default: 'API Key' },
active: { type: Boolean, default: true },
iat: { type: Date, required: true },
project: { type: mongoose.Schema.Types.ObjectId, ref: 'Project', required: true },
});
这就是我使用jsonwebtoken
npm包生成相同令牌的方式:
import jwt from 'jsonwebtoken';
jwt.sign({ project, iat: CONST_TIMESTAMP }, config.secrets.session);
现在我的问题是:
jwt
以外,还有其他方法吗?答案 0 :(得分:0)
JWT是用于给定目标的标准方法,对于您来说,我建议使用非对称签名密钥。
这样做的好处是,消费者或客户将需要信任发行者,并且可以通过多种方式分配密钥的公开部分。
因此,这消除了密钥重新生成的要求,您还可以使用标准技术来保护签名密钥的私有部分。