为api访问生成安全令牌

时间:2015-08-22 06:06:10

标签: node.js security authentication jwt bearer-token

我需要生成一个安全令牌来访问api。用户将验证并成功验证我将需要生成令牌。

重要提示:我确实要求我可以随时撤销用户对API的访问权。

选项1:

我可以生成一个随机字符串并将其用作令牌。将令牌和用户存储在数据库中。当用户传递令牌时,我会检查DB是否有令牌,如果存在则转到...

这使我能够通过删除用户令牌来撤销访问权限。如果他们尝试重新登录并且令牌已经消失,他们就无法访问。我也可以根据时间从DB中过期令牌。

我正在使用nodejs并且已经看到了这个:

Secure random token in Node.js

require('crypto').randomBytes(48, function(ex, buf) {
  var token = buf.toString('hex');
});

这是否真的安全,因为有人无法猜出我生成的令牌?

选项2:

使用类似jwt的东西。在auth上生成一个具有用户ID的jwt。当用户在请求中传递jwt时,我确保jwt是有效的,如果是这样,请抓住用户ID并且好好去。这似乎更安全,因为jwt可以防止篡改。

问题是撤消对api的访问。我可以在db中存储所有的jwts(直到它们到期),在请求验证的jwt上并确保它在我的db中。如果我要撤销,我可以将其从数据库中删除。这里的问题是,我现在有了验证jwt并查找它以确保它在我的数据库中的开销。

有没有一种方法可以使用jwt撤销访问权限?

1 个答案:

答案 0 :(得分:2)

这个问题可能会在答案中引用很多意见,因此最终取决于您和您的安全要求。

我喜欢的一种解决方案是按照您建议的方式生成随机字符,并在其中包含用户拥有的内容(例如电子邮件地址或ID)。然后还包括一个时间戳,以了解它何时生成。拿出那些东西并将它们连接成一个单独的字符串(可能使用一些字符来分割部分)。所以你最终得到的结论是:

<random-string-of-characters>|<user-email-address>|<timestamp>

现在加密该字符串,可能使用类似bcrypt之类的东西,并且该blob最终会被称为&#34;令牌&#34;。这个内部用户不必了解它,他们只需要存储它,然后再访问它以将其发送到您的安全层进行验证。您可以通过解密并验证部件来验证它。

此解决方案可让您完全控制授予用户访问权限的方式。您可以继续将生成的字符存储在数据库中并随时撤消它,或者查看时间戳以查看它们是否超时&#34;。

我想有很多解决方案,所以这只是一个:)