【问题标题】:log out a stateless app注销无状态应用
【发布时间】:2017-01-07 09:22:57
【问题描述】:

这是我的项目结构的样子

  • UI:AngularJS 应用程序
  • 后端:Java + MongoDB 无状态应用

UI 对给定用户进行身份验证,REST api 使用 JWT 令牌进行响应。对于每个后续请求,REST api 都需要标头中的令牌,如果不存在则返回 Unautorized 错误。

现在,实现logoff 功能的最佳方法是什么?有一点很清楚,我将从 UI cookie 中删除令牌。但我需要告诉服务器用户已经注销。

我正在考虑维护一个内存数据库来跟踪谁已登录并在用户注销后将其从内存中删除,但它会使应用程序具有某种状态(我猜)。此外,扩展应用程序可能会变得复杂,因为我必须在所有节点上复制内存中的用户。

对于每个 REST 调用,我都从 MongoDB 获取用户详细信息。使用数据库存储登录状态是否有意义?我只是在大声思考。因为我不知道该往哪个方向走。

【问题讨论】:

  • “但是我需要告诉服务器用户已经登出。” 为什么?无论如何,只需创建一个从后端删除令牌的注销端点。
  • 为什么 这样服务器就会知道任何后续请求都需要登录凭据。正如我所提到的,如果我不这样做并且令牌已被某人窃取,即使客户端已注销,他们也可以继续发送请求。 只是建立一个注销端点会引起我在倒数第二段中提到的问题,即可扩展性。
  • 我认为在数据库中存储登录状态与从数据库中删除无效令牌之间没有任何性能差异
  • “这样服务器就会知道任何后续请求都需要登录凭据”——我认为你不明白“无状态”的概念
  • 受限端点(需要一定的权限/访问级别)应该总是需要登录凭据

标签: rest security stateless


【解决方案1】:

如果您使用 JWT 来维护客户端会话,那么服务器应该没有登录和注销用户的概念。

这是您决定使用 JWT 所付出的代价(当然,这可能没问题,具体取决于您对应用程序的风险偏好)。

如果您希望在服务器端注销用户,那么您应该废弃 JWT 模型并在服务器端记录会话。这样您就可以删除服务器端记录以及注销时的 cookie。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-09
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-09
    相关资源
    最近更新 更多