jsonwebtoken 存储在服务器 nodejs 中的位置。用户注销后如何使 JWT 过期
Where jsonwebtoken stored in server nodejs . How to expire JWT once user gets logout
我将令牌存储在客户端的 Session/Local 存储上 side.The 我面临的问题是,一旦用户复制该令牌并将其用于其他登录会话服务,它就可以工作,但它应该return JWT.varify 上的无效令牌。
有什么方法可以在用户注销后 Blacklist/Delete/Expire
当前使用的令牌吗?
有几种方法可以为此目的设置黑名单:
1) (数据库中的黑名单用户) 为用户添加一个数据库列isTokenExpired 并在成功登录时将其设置为false,当您希望令牌过期时将其设置为true (例如,当用户更改密码、注销或足够的时间已过期时)。
以上方法可以达到你的目的,但我觉得这是对编程的侮辱。我假设您正在使用 JWT,这样用户就不必每次都登录,并且您只有 1 台服务器正在执行身份验证和所有其他服务器功能。虽然 JWT 不是为 "sessions" 设计的,但为此目的使用 JWT 可以减轻数据库的负载。但是,如果您随后在每个用户操作上设置和检查另一个数据库标志,您将再次添加该负载,并且您仍然拥有与 JWT 等相关的所有负载,因此您不妨对每个用户操作重新进行身份验证。
2) (将服务器 RAM 中的 user/the 令牌列入黑名单) 当我自己研究这个问题(如何使单个令牌无效)时,我找到了一些解决方案服务器在 RAM 中维护白名单或黑名单,因此无需添加数据库或文件负载。这可能是一个更好的解决方案,但我不记得任何有助于此的库的名称。也许其他人可以提到其中的一些。
3) 将令牌设置为非常短的到期时间(例如 60 秒或 5 分钟) 并将客户端设置为每隔(~55 秒)自动请求一个新令牌或 ~4 分 50 秒)。然后服务器将以我假设您现在正在执行的相同方式检查和验证令牌,而无需访问数据库,然后将生成一个新令牌,该令牌对所有其他字段具有相同的值,但具有新的 "expiry time" 值,并将该令牌发送回客户端,客户端将用这个新的 JWT 替换其 JWT,并重新启动其 5 分钟计时器。这是其他选择之间的一个很好的平衡,并且保留了使用 JWT 的一些好处,但确实增加了一些小成本。我认为这对许多应用程序来说是一个很好的解决方案,但它肯定取决于特定的应用程序,但它有点 hacky 并且绝对不是 "the right way" 去做。
4)使用JWT + Sessions这是"the right way"来做的。经过很久以前的研究,我意识到 JWT 并非设计用于维护会话:JWT 只是一种表示声明的安全方式。想象一下拥有一个拥有数千万用户的大型系统,并且您需要遍布全球的许多服务器。您可能有 3 个 身份验证服务器 (在美国、澳大利亚、英国)。然后用户将其用户名和密码发送到身份验证服务器,详细信息将在数据库中进行检查,如果有效,将发送一个 JWT。然后,您可能还会有 10 多个常规服务器来处理您的 API。然后,客户端将使用其 JWT 向 API 服务器发出每个请求。 API 服务器将拥有身份验证服务器用于生成 JWT 的密钥副本,并将验证您的 声明。您的索赔是 "I am authenticated"。然后这个 API 服务器将生成一个会话,客户端将是 "logged in"。 JWT 可能会设置为在 5 分钟后过期。如果用户在这 5 分钟内没有登录,他们将无法登录。如果他们登录,他们将一直登录,直到 API 服务器将他们踢出。每当发生导致您想要踢用户的事情时,API 服务器可以关闭会话。即使对于单服务器应用程序,这仍然是正确的方法。 JWT 不适用于会话,您(就像我一样)开始注意到这些看似无法解决的问题,因为您正在使用 JWT 进行会话。
无论如何,我推荐 3 或 4,这两个选项对于许多应用程序都有净正值。
1 和 2 带来的问题似乎多于它们提供的好处。
当然,这始终取决于应用程序。如果您只是以 5 美元的价格在 fiverr 上制作一些网站,那么就随心所欲,您明白我的意思吗?
如果有更好的解决方案我也很想知道!请记住,JWT 代表一个声明,并准确考虑您的客户代表的是什么声明。
Answering your first question (where is JWT stored in server Node.js)
JWT 令牌不存储在服务器端。它是一个基于签名(通过密钥,RFC 7519)的认证系统。
所以服务器只验证令牌,如果验证通过,它就会向用户授予访问权限,因此任何拥有您的令牌的用户都可以充当您的角色。
例如 - 您可以复制已登录 Facebook 用户的 cookies/storage,然后转到另一个浏览器并设置这些 cookies/storage。您将以该用户身份登录一段时间。
仅供参考@safebookverified 第三种方式最常用。谢谢。
我将令牌存储在客户端的 Session/Local 存储上 side.The 我面临的问题是,一旦用户复制该令牌并将其用于其他登录会话服务,它就可以工作,但它应该return JWT.varify 上的无效令牌。
有什么方法可以在用户注销后 Blacklist/Delete/Expire
当前使用的令牌吗?
有几种方法可以为此目的设置黑名单:
1) (数据库中的黑名单用户) 为用户添加一个数据库列isTokenExpired 并在成功登录时将其设置为false,当您希望令牌过期时将其设置为true (例如,当用户更改密码、注销或足够的时间已过期时)。
以上方法可以达到你的目的,但我觉得这是对编程的侮辱。我假设您正在使用 JWT,这样用户就不必每次都登录,并且您只有 1 台服务器正在执行身份验证和所有其他服务器功能。虽然 JWT 不是为 "sessions" 设计的,但为此目的使用 JWT 可以减轻数据库的负载。但是,如果您随后在每个用户操作上设置和检查另一个数据库标志,您将再次添加该负载,并且您仍然拥有与 JWT 等相关的所有负载,因此您不妨对每个用户操作重新进行身份验证。
2) (将服务器 RAM 中的 user/the 令牌列入黑名单) 当我自己研究这个问题(如何使单个令牌无效)时,我找到了一些解决方案服务器在 RAM 中维护白名单或黑名单,因此无需添加数据库或文件负载。这可能是一个更好的解决方案,但我不记得任何有助于此的库的名称。也许其他人可以提到其中的一些。
3) 将令牌设置为非常短的到期时间(例如 60 秒或 5 分钟) 并将客户端设置为每隔(~55 秒)自动请求一个新令牌或 ~4 分 50 秒)。然后服务器将以我假设您现在正在执行的相同方式检查和验证令牌,而无需访问数据库,然后将生成一个新令牌,该令牌对所有其他字段具有相同的值,但具有新的 "expiry time" 值,并将该令牌发送回客户端,客户端将用这个新的 JWT 替换其 JWT,并重新启动其 5 分钟计时器。这是其他选择之间的一个很好的平衡,并且保留了使用 JWT 的一些好处,但确实增加了一些小成本。我认为这对许多应用程序来说是一个很好的解决方案,但它肯定取决于特定的应用程序,但它有点 hacky 并且绝对不是 "the right way" 去做。
4)使用JWT + Sessions这是"the right way"来做的。经过很久以前的研究,我意识到 JWT 并非设计用于维护会话:JWT 只是一种表示声明的安全方式。想象一下拥有一个拥有数千万用户的大型系统,并且您需要遍布全球的许多服务器。您可能有 3 个 身份验证服务器 (在美国、澳大利亚、英国)。然后用户将其用户名和密码发送到身份验证服务器,详细信息将在数据库中进行检查,如果有效,将发送一个 JWT。然后,您可能还会有 10 多个常规服务器来处理您的 API。然后,客户端将使用其 JWT 向 API 服务器发出每个请求。 API 服务器将拥有身份验证服务器用于生成 JWT 的密钥副本,并将验证您的 声明。您的索赔是 "I am authenticated"。然后这个 API 服务器将生成一个会话,客户端将是 "logged in"。 JWT 可能会设置为在 5 分钟后过期。如果用户在这 5 分钟内没有登录,他们将无法登录。如果他们登录,他们将一直登录,直到 API 服务器将他们踢出。每当发生导致您想要踢用户的事情时,API 服务器可以关闭会话。即使对于单服务器应用程序,这仍然是正确的方法。 JWT 不适用于会话,您(就像我一样)开始注意到这些看似无法解决的问题,因为您正在使用 JWT 进行会话。
无论如何,我推荐 3 或 4,这两个选项对于许多应用程序都有净正值。
1 和 2 带来的问题似乎多于它们提供的好处。
当然,这始终取决于应用程序。如果您只是以 5 美元的价格在 fiverr 上制作一些网站,那么就随心所欲,您明白我的意思吗?
如果有更好的解决方案我也很想知道!请记住,JWT 代表一个声明,并准确考虑您的客户代表的是什么声明。
Answering your first question (where is JWT stored in server Node.js)
JWT 令牌不存储在服务器端。它是一个基于签名(通过密钥,RFC 7519)的认证系统。
所以服务器只验证令牌,如果验证通过,它就会向用户授予访问权限,因此任何拥有您的令牌的用户都可以充当您的角色。
例如 - 您可以复制已登录 Facebook 用户的 cookies/storage,然后转到另一个浏览器并设置这些 cookies/storage。您将以该用户身份登录一段时间。
仅供参考@safebookverified 第三种方式最常用。谢谢。