如何正确使用 express-gateway 对 Web 应用程序进行身份验证?
Posted
技术标签:
【中文标题】如何正确使用 express-gateway 对 Web 应用程序进行身份验证?【英文标题】:How to properly use express-gateway for authentication of a web app? 【发布时间】:2019-01-05 11:31:51 【问题描述】:总的来说,我对微服务和 API 网关的概念相当陌生。我试图了解 api 网关在使用许多微服务的现代 Web 应用程序中所扮演的角色。我一直在阅读 express-gateway 的文档和教程,但对于 Web 应用程序如何使用 express-gateway 等设置的 api 网关执行身份验证有点困惑。
我的 Web 应用程序会有多个可以与之通信的微服务。我认为在我所有的微服务前面放置一个 API 网关可以使每个微服务都不需要担心用户/请求是否经过身份验证,因为如果正在与微服务对话,则意味着 api 网关已验证请求是有效用户。我对此的理解正确吗?
假设我认为 api 网关充当其他微服务的看门人的想法是正确的,我的后续问题是它如何执行的细节。
这是否意味着所有的用户创建和身份验证都是由 api 网关执行的?这意味着我将没有自定义用户创建/登录微服务?或者我是否可以通过 api 网关自定义用户创建微服务公开访问,该微服务在创建时本身会在 api 网关中创建用户帐户?我的微服务现在是否将用户信息复制到某个数据库和快速网关自己的存储中?我想我的普遍困惑是,api 网关是否完全脱离了 web 应用程序自己的微服务来承担身份验证/用户创建的角色,还是你仍然需要这两个部分?
我认为我自己的身份验证微服务会首先验证用户,然后使用 api 网关生成有效的短期令牌,但是阅读有关在 express-gateway 中创建用户或应用程序帐户以进行身份验证的信息让我对角色感到困惑每一场比赛。
【问题讨论】:
【参考方案1】:要大致了解 API 网关在基于微服务的解决方案中的作用,我建议您看一下我几个月前所做的 presentation。这应该可以澄清一些事情。
我的理解正确吗?
是的,你明白了。如果您观看视频,您实际上也可以在实践中看到该概念。
对于存储,这种情况取决于。
Express Gateway 提供一部分身份服务,例如用户、应用程序和凭据。它们足以满足大多数应用程序的使用,但您可能会发现自己需要使用外部服务,例如 Auth0。
现在,撇开功能不谈,您将数据存储在哪里,一切由您决定。您可以将部分数据保存在 Express Gateway 中,将部分数据保存在您自己的数据库中,或者完全保存在 Express Gateway 中。这里没有好的或坏的策略。
【讨论】:
谢谢!你的介绍确实很有帮助。你会碰巧有一个包含你演示文稿中所有示例的公共回购吗?特别是在将服务一分为二之后的 express-gateway 配置?我找到了github.com/XVincentX/apigateway-playground,这似乎只是拆分前的初始回购。一个完整的例子来学习会很有帮助。 所以就“存储数据的位置”而言,您说我的两个选项大致是: 1. 仅存储用户名/密码/可能在快速网关中存储某种类型的唯一 ID 或外键,然后使用来自快速网关的用户的唯一 ID 链接到我自己的用户数据库记录,其中可能包含电子邮件地址等其他内容? 2. 将我所有的用户信息存储在 express-gateway 数据库中,但仍有某种唯一的 id/外键用于链接到我自己的其他用户数据库记录? 对于实际的身份验证流程,以下听起来是否有效?用户登录或创建新用户,该用户专用于 express-gateway。 Express-gateway 对用户进行身份验证或创建用户,如果一切正常,它会返回一个 JWT,其中包含用户的唯一 ID,然后在任何后续请求中发送给我的其他微服务。如果任何请求在 express-gateway 后面到达我自己的微服务,那么这意味着他们有一个带有有效声明的 JWT,该声明指示可用于在我自己的服务数据库中创建记录的用户的唯一 ID? 检查 repo 上的其他分支,你会发现所有的步骤。你所有的假设对我来说都是有意义的。 我想知道一些事情,我可以使用express gate的方式来实现自己的认证逻辑,而不是在微服务上,而是在网关本身上。例如,我想从数据库中搜索用户并自己制作一个 jwt 令牌,并使该身份验证过程成为网关流程的一部分,就像 auth 2.0 和其他一样。我不想在网关级别制作应用程序或用户。以上是关于如何正确使用 express-gateway 对 Web 应用程序进行身份验证?的主要内容,如果未能解决你的问题,请参考以下文章
Kubernetes 服务的 Express-gateway 配置