使用 ElasticSearch 将身份验证/会话管理放在哪一层

Which layer to put authentication / session management for a web app with ElasticSearch

我们正在构建一个票务 Web 应用程序,其组件是

datastore - PostgreSQL 用于关系数据,ElasticSearch 用于票证日志文本(以启用搜索功能)

backend - Python 快API

frontend - Nginx 反向代理 Angular/HMTL 作为 UI

一旦用户使用他们的用户名和密码(存​​储在数据库中)成功登录,该用户就可以查看 his/her 自己团队的票证以及关键字搜索所有票证日志的能力(历史记录处理该票证的用户记录的评论),当然还有相关的票证本身。

由于我对构建 Web 应用程序还很陌生,所以这更像是一个应用程序设计问题(包括身份验证部分)。我的问题是:

  1. 使用 OAuth2 身份验证,哪一层处理会话管理,前端还是后端?

  2. 除了 frontend/backend 中的身份验证之外,我们是否应该使用 ElasticSearch 自己的身份验证 API(也包括 OAuth2)?

  3. 如果(2)的答案是肯定的,您能否建议如何整合这两种认证机制?

  4. 前端还是后端调用ElasticSearch的API拉取数据?

  5. 如果(2)的答案是否定的,而(4)的答案是后端,是否将ElasticSearch放在只能由后端服务器访问的私有网络中是否足够?

  1. 会话应由可识别用户的安全 cookie 或令牌表示。在大多数情况下,此 ID 映射到数据库存储,除非有充分的理由,否则我的目标是避免单独的会话存储。

  2. 可能不会 - 随着时间的推移,您的应用可能需要许多安全功能 - 这组 Curity Concepts 文章可能会让您了解常见要求。

  3. 您的 API 应该将 Elastic Search 视为许多可能的数据源之一。看看能不能用Elastic的Client Credentials Grant来获取数据。 API 然后可能需要根据用户 ID 检查访问或过滤,这可能是数据设置的一个棘手部分。

  4. 后端

  5. Elastic Search 不应暴露在互联网上——任何其他连接到敏感数据源的组件也不应暴露在互联网上。通常的解决方案是在它前面放一个反向代理——比如NGINX/Kong或者一个云API网关。