oauth - 使用 JWT 保护后端微服务之间的通信
问题描述
假设我们在后端有很多微服务。有网关 API 服务授权用户执行在 UI 中完成的某些操作。比那是微服务(MicroBackend1)调用下一个微服务(MicroBackend2),下一个调用下一个。MicroBackend1 和 MicroBackend2 之间应该传递什么 JWT 进行授权?哪种方法是正确的:
UI 用户的 JWT 仅传递给第一个 MicroBackend1。比它将他自己的 JWT 传递给 MicroBackend2。上下文知道在 UI 中执行的操作在 MicroBackend2 中不可用的用户上下文。
MicroBackend1 向 STS 发出 ActAs 令牌请求,然后将新的 JWT 传递给 MicroBackend2。这意味着 MicroBackend2 知道用户上下文。
MicroBackend1 直接将他从 UI 获得的 JWT 传递给 MicroBackend2,因此它具有用户上下文。
这种解决方案的优缺点是什么?您尝试过哪一种,我们应该选择哪一种?
解决方案
首先,我会说还有另一个选项,这是在 api 网关本身中剥离身份验证令牌,如果需要使用用户上下文膨胀标头并将其传递给下游。我们倾向于这样做,因为我们会考虑您在通过 api 网关访问我们安全区域的一部分之后访问的任何服务。我们将所有防御措施放在 api 网关之前或处。这允许服务彼此自由交谈。然而,我们也在这里放松了授权位。如果你能忍受它,它会最有效,因为它减少了一些开销,这是我最常使用的。
然而,在此之前,我曾经从 UI 获取 JWT 令牌,它由我们的节点层 (BFF) 验证,然后交换我们过去称为节点访问令牌的东西。本质上,我们在节点级别有一个用户,我们曾经为该用户生成此令牌并传递。这个令牌对几乎所有东西都有授权(这逐渐发生,最终我们最终放弃了对下游服务的授权)它对我们很有帮助,因为我们可以确保用户访问令牌对我们的下游服务几乎没有用处,并且如果调用下游直接使用用户令牌将被丢弃。生成我们自己的令牌的缺点是我们最终授予了对所有服务和所有 API 的访问权限。
如果您将令牌从 UI 传递到下游,则利弊有些相反。给用户适当的角色也变得困难。
推荐阅读
- qt - MouseArea 调用 FileDialog :知道哪个元素打开了 FileDialog (QML)
- javascript - Google PageSpeed Insights 是否会检测到试图延迟加载 javascript 的网站?
- linux - 在 Linux 上的 Hello_World 控制台应用程序中嵌入 V8 引擎 - GCC 7 链接器错误(未定义的引用)
- nested - 包裹嵌套模块中的环境变量
- reactjs - 如何修复 TypeError:无法在布尔值“true”上创建属性“插件”
- antlr - 升级ANTLR语法
- c++ - setw() 和 "\t" 是一回事吗?
- reactjs - 导入 HOC 组件进行测试
- javascript - 无法从 React 前端将图片上传到 MongoDb
- python - 使用 pandas 替换 .tsv 文件中的特殊字符