微服务架构中的 SPA 认证

Posted

技术标签:

【中文标题】微服务架构中的 SPA 认证【英文标题】:Authentication for SPA in Microservice architecture 【发布时间】:2021-02-10 21:59:13 【问题描述】:

我正在寻找一种基于 Spring Boot 微服务为我们的项目创建注册、身份验证和授权的最佳方法。微服务将为 SPA 应用程序提供 REST API,稍后为移动应用程序(androidios)提供。实际上,我们在 Postgres 数据库中拥有所有用户。

正如我提到的,SPA 和移动平台将使用用户注册和身份验证,因此我更喜欢 RESTful API。

我的想法是拥有一个 auth-service 来解析 auth* 操作,并为其他微服务提供一个公钥来解码和验证 JWT。

事实上,我们不需要向外部服务提供授权,使用像 Keycloak 这样的 OIDC 提供程序是否有意义?还是自定义身份验证是更好的选择?

【问题讨论】:

无状态和基于标准的 imo 总是更安全。 ` 一个将解决 auth* 操作的 auth-service` 我会质疑为授权决策创建服务间依赖关系是否明智。每个服务可能都应该拥有自己的授权逻辑,因为这可能会变得非常复杂和服务感知。 @Taylor 也许我写得不好,对不起我的英语。我想要spring资源服务器配置,可以用最少的自定义代码进行配置。它可以使用公共 rsa 密钥消费端点,并自行解码和验证令牌。所以身份验证服务将只提供这个端点,而不是授权逻辑。 啊,我以为你说auth* 是指身份验证和授权。我肯定会去 OIDC 内部。如果您需要为 SSO 提供支持,很容易从 SAML 进行外观调整。我自己没有使用过 Keycloak,但从我信任的人那里听到了好话。我鼓励您考虑的唯一另一件事是像 Auth0 或 AWS cognito 这样的服务。取决于您的需求,但托管/操作少一件总是好的。 您无需对外部服务(如 Google 或 Facebook)进行身份验证即可使用 OIDC。虽然处理安全“自定义”从来都不是更好的选择。使用已被证明是安全的标准和服务,例如Azure B2C、AWS Cognito、Auth0。您可能应该将您的用户转移到这些服务之一,并让自己免于处理密码、hasing、salting 等。 【参考方案1】:

如果您想将 Keycloak 提供的授权功能用于 OIDC 支持,您不必强制使用它。您可以从它的注册、身份验证或忘记密码流程以及易于配置的 OAuth/OIDC 功能中受益。

Keycloak 的另一个不错的功能是在客户端的平滑集成,它允许您的代码几乎无需更改即可工作。我没有评估他们的 Spring 适配器,但是在我参与的项目中,因为它们都是基于 JEE 并且使用所有应用程序服务器提供的标准安全 API,我们真正受益于为我们的应用程序服务器使用 Keycloak 适配器。在请求到达我们的代码之前,它会处理您在问题中描述的所有逻辑,这意味着一切都已设置好(即令牌已得到验证/验证,并且已从中提取主体和角色,我们可以通过 request.getPrincipal() 访问它或sessionContext.getCallerPrincipal()request.isUserInRole()等)。

【讨论】:

以上是关于微服务架构中的 SPA 认证的主要内容,如果未能解决你的问题,请参考以下文章

微服务架构中的安全认证与鉴权

认证鉴权与API权限控制在微服务架构中的设计与实现

微服务架构中的认证授权设计

认证鉴权与API权限控制在微服务架构中的设计与实现

认证鉴权与API权限控制在微服务架构中的设计与实现

基于事件驱动架构构建微服务第15部分:SPA前端