【问题标题】:Authentication strategy between 2 node.js microservices2 node.js 微服务之间的认证策略
【发布时间】:2019-06-13 12:15:25
【问题描述】:

我打算制作一个简单的管理员 CP。我是老派的 PHP 开发人员,通常都在一个巨大的单体服务器中,微服务的概念不适用。

在我的下一个应用中,我想拥有:

Express UI(前端) REST/GraphQL API 数据库服务器

这个想法是尽可能地限制对 DB 的访问。来自用户的所有请求都将仅发送到前端,API 将仅由我的解决方案中的其他服务器在内部使用。

我将在 API 和 DB 之间设置 IP 过滤器,并且可能在前端和 API 之间设置。但我担心的是 - 假设我希望一个管理员创建一个产品。虽然该用户将在前端使用会话进行身份验证,但我也需要对发送到 API 的请求进行某种程度的身份验证。暂时忽略 IP 过滤器,不希望任何人都能够向 API 发送 REST 请求。

我有几个想法,请给我你的意见:

  1. 使用 mongodb 在 API 和前端之间共享 express-session(可能在另一台服务器上) - 我看到了延迟问题

  2. 将 API 服务与前端放在同一台服务器上并使用 redis 共享会话 - 有点违背微服务分离的目的

  3. 登录时,为任何用户操作生成始终在前端和 API 之间转发的 jsonwebtoken - 窃取 cookie 将是一个问题,因为我只能验证用户登录,而不是他授权执行某些操作/p>

  4. 登录时,将私钥发送给管理员并让他签署所有转发到 API 的请求 - 这看起来像 CPU 过度杀伤


我缺少任何常用的解决方案吗?将前端和 API 中间人分开是过分的,还是一种好的做法?我可以轻松地合并 2 并直接从前端与 DB 对话,然后我可以像使用 PHP 一样通过会话管理所有内容。

感谢您的任何意见!干杯

【问题讨论】:

    标签: node.js software-design conventions


    【解决方案1】:

    (1) 的更精细的实现是使用会话服务器。这个想法是纯粹消除数据库查找延迟,而不是一般会话查找的瓶颈。它充当缓存层。零编码实现是使用 redis 或 memcache 之类的东西作为会话存储。

    不过,一般而言,像 JWT 这样的加密签名机制将更具可扩展性,因为它涉及零 I/O 查找。您所做的就是验证令牌是否已正确签名。只要您将应用程序保密,您就很安全。您甚至可以直接在令牌中对用户角色和权限等内容进行编码,从而完全避免查询数据库。

    JWT 的关键思想是所有的安全性都隐藏在后端。前端仅将令牌回显给服务器作为身份验证证明。

    但是由于前端存储了token,所以可以被javascript劫持。一种解决方案是使用HttpOnly cookie 作为传输令牌的机制。我什至见过令牌的主要部分在 Authorization 标头中发送但签名在 HttpOnly cookie 中发送的实现。这会阻止脚本读取整个令牌。

    【讨论】:

    • 谢谢,“既然前端存储了token,就可以被js劫持”是什么意思?怎么劫持?
    • 通常的策略是将令牌存储在 localStorage 中,任何设法将自己注入您的页面的脚本都可以使用localStorage.getItem() 获取令牌。如果您确定脚本注入是不可能的,那么您应该没问题。但你真的确定吗?那么恶意浏览器扩展呢?因此使用 HttpOnly cookie 的策略
    • 我正在为我当前的项目使用 JWT,而我的前端是完全静态的,因此它由 Amazon S3 而不是真正的服务器提供服务。
    猜你喜欢
    • 2015-06-21
    • 2016-03-05
    • 2015-09-11
    • 1970-01-01
    • 2017-12-09
    • 2019-01-18
    • 2021-03-27
    • 2018-08-21
    • 2020-12-14
    相关资源
    最近更新 更多