为api访问生成安全令牌

我需要生成一个安全令牌访问一个API。 用户将auth和成功auth我需要生成一个令牌。

重要提示:我有一个要求,我需要能够随时撤销用户对api的访问权限。

选项1:

我可以生成一个随机string,并将其用作令牌。 将令牌和用户存储在数据库中。 当用户通过令牌时,我检查数据库的令牌,如果它存在去…

这使我能够通过删除用户令牌来撤销访问。 如果他们试图重新login,令牌消失,他们将无法访问。 我也可以根据时间从数据库中删除令牌。

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

在Node.js中安全随机令牌

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

这真的很安全,因为有人不能猜测我生成的令牌吗?

选项2:

使用像jwt的东西。 在身份validation用用户ID生成一个jwt。 当用户通过一个请求的jwt时,我确信jwt是有效的,如果是这样的话,抓取用户ID和好去。 这看起来更安全,因为jwt可以防止篡改。

问题是撤销对API的访问。 我可以存储所有jwts(直到它们到期)在数据库中,请求validation的jwt,并确保它在我的分贝。 如果我想撤销,我可以从数据库中删除它。 Con在这里是我现在有validation的jwt和查找确保其在我的分贝的开销。

有使用jwt撤销访问的好方法吗?

这个问题可能会在答案中引起很多意见,所以最终取决于你和你的安全要求。

我喜欢的一种解决scheme是按照您所build议的相同方式生成随机字符,并包含用户拥有的内容(例如电子邮件地址或ID)。 然后还包括一个时间戳,以了解它何时生成。 把这些东西串在一起成为一个单一的string(也许用一些字符来分割部分)。 所以你最终会得到像这样的东西:

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

现在encryption这个string,也许使用类似bcrypt的东西,而这个blob最终会成为你所说的“token”。 这个内部用户不需要理解它,只需要存储它,稍后访问它将其发送到安全层进行validation。 您通过解密并validation部件来validation它。

这个解决scheme使您可以完全控制授予用户访问权限的方式。 您可以继续将生成的字符存储在数据库中并随时撤销它,或查看时间戳以查看是否“超时”。

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