【发布时间】:2015-11-16 03:27:07
【问题描述】:
我需要生成一个安全令牌来访问 api。用户将进行身份验证,并且在成功的身份验证后,我将需要生成一个令牌。
重要提示:我确实需要能够随时撤销用户对 api 的访问权限。
选项 1:
我可以生成一个随机字符串并将其用作令牌。将令牌和用户存储在数据库中。当用户传递令牌时,我会检查数据库中的令牌,如果存在就去...
这使我能够通过删除用户令牌来撤销访问权限。如果他们尝试重新登录并且令牌消失了,他们将无法访问。我还可以根据时间使数据库中的令牌过期。
我正在使用 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 的访问。我可以将所有 jwt(直到它们过期)存储在数据库中,根据请求验证 jwt 并确保它在我的数据库中。如果我想撤销,我可以将它从数据库中删除。这里的缺点是我现在有验证 jwt 并查找它以确保它在我的数据库中的开销。
有没有使用 jwt 撤销访问的好方法?
【问题讨论】:
-
在数据库中存储 jwt 并检查它们的状态否定了这些令牌的主要优点 - 一旦经过身份验证,您就可以传递令牌,无需进一步查找。您可以设置一个较短的到期时间,但这可能会惹恼应该保持登录状态的用户。JWT 可能不是您想要的。
-
@NickJHoran 谢谢!您对主要优点是正确的,这就是为什么该解决方案看起来很糟糕。然而,无论我在哪里,似乎人们都在问如何“撤销”jwts。如果您出于安全原因需要这样做,或者如果用户在那里更改密码,则会发生这种情况。我看到你链接到刷新令牌。这是一个可能的答案吗?
-
这确实取决于您的设计要求,但刷新令牌可能对您有用。
标签: node.js security authentication jwt bearer-token