如何实现多后端服务和解耦架构的SSO

托尼·Tc

背景

有几个服务(spring boot REST API 服务和其他一些使用 REST API 的产品)作为后端,一些 angular 应用程序(一些具有不同二级域名的网站)作为前端。

一个前端应用可以通过异步方式调用一些后端服务(它们通过反向代理在同一个域下,所以没有CORS问题)。

目标

SSO,即。如果用户成功登录前端应用程序,则用户无需再次登录即可访问其他应用程序。(当然,在启用cookie的同一浏览器中)

问题

  1. REST API 是否应该遵循客户端凭据流(如果未通过身份验证则返回 401)或身份验证代码流(如果未通过身份验证则返回 302)?

许多文档/提示/帖子建议 REST API 应该遵循客户端凭据流,因为它是无状态的并且不知道重定向 uri。但是,如果我没记错的话,使用客户端凭据流来实现 OSS 是不可能的,否则所有后端服务都应该是 keycloak 中可以共享client_idclient_secret.

如果使用Authentication Code Flow,问题是前端如何在用户成功登录后检索响应数据。 过程类似于:

front-end             back-end     keycloak
    |  -- asyn call -->  |
    |  <-- HTTP 302 --   |
    |  -- redirect to login page -->  |
    |     <-- redirect to where ???-- |
  1. 如果问题 1 的答案是遵循 Client Credentials Flow,那么在多个后端服务之间共享相同client_id共享的最佳实践client_secret吗?或者还有其他解决方案吗?

  2. 如果问题 2 的答案是遵循 Authentication Code Flow,那么成功登录后如何处理异步 REST API 调用?

扬·加拉吉

1.) SSO 协议

Open ID Connect应该使用。理论上也有SAML,但那个是为 Web 应用程序指定的,而不是为 SPA 应用程序/REST API 指定的。

2.) 前端(SPA 应用程序)管理身份验证

您需要用户身份,因此客户端凭据流不正确。你需要Authorization Code Flow with Proof Key for Code Exchange (PKCE). 使用成熟的(OIDC 认证的)库(例如https://github.com/damienbod/angular-auth-oidc-client),他们将管理一切(令牌刷新、路由授权、注销等)。您不需要任何名称中带有 Keycloak 的库(OIDC 是标准,必须实现,而不是 Keycloak)。Fronted 为每个 API 请求添加访问令牌(例如使用 Angular 拦截器)。

3.) 后端(REST API)只验证令牌

来自前端的调用是XMLHttpRequest请求——它们在后台。有 302 响应(重定向到 auth)是没有意义的。用户将无法看到这一点,所以这就是为什么401 Unauthorized应该返回的原因(然后前端可以有自己的业务逻辑来处理它——例如重定向到身份验证)。所以后端不需要实现任何登录流程。他们只验证请求中使用的令牌的有效性。最终,他们进行授权,例如,只有具有某些特定组/角色的用户才能执行相同的操作 - 只有编辑者可以编辑,只有管理员可以删除,否则以正确的响应代码响应 - 403 Forbidden

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何注册和解决服务的多个实现?

微服务架构中如何将Auth服务与其他服务解耦?

如何在 Cqrs 架构中实现基础设施服务?

如何管理微服务架构中的多对多关系?

实现微服务架构的含义

函数式编程和解耦

如何为多区域架构实现Google Cloud Run的负载平衡

Java Web应用程序-如何使用多模式架构实现Saas?

事件溯源和 CQRS 如何帮助解耦微服务?

如何为已解耦的React前端提供服务?

如何使用 Facebook 身份验证和后端服务器实现 Android 应用程序

如何建立多架构快照

Resque和多服务器架构

无服务器框架:如何实现完整的“基础架构即代码”?

如何实现签约检测时卡夫卡参与微服务架构?

我应该如何避免在微服务架构中多次实现方法

如何在Spring Boot微服务架构中使用Keycloak实现JWT?

如何在微服务架构中实现即时一致性?

(设计问题)如何解耦前端和后端以保护路由(后端)代码?(Node.js-快速-反应)

Next.js + Graphql 解耦架构中如何转发用户会话?

我应该如何在Django应用程序中使用AAD实现用户SSO(使用Django Microsoft身份验证后端模块)?

无法通过我的前端从我的 node js 服务器下载图像文件(我的后端和前端是解耦的)

如何通过每项服务的Spring Cloud Stream Kafka和数据库实现微服务事件驱动架构

如何在Android应用中实现SSO

在后端工作期间如何实现纺车?

在cakephp 3.0中如何做后端和前端架构?

如何在架构中实现GraphQL片段?

如何创建SSO服务提供商?

如何通过HTTP调用启用SSO的服务