OpenID 重定向与持有者



我正在C++开发一个微服务(出于低延迟的原因(,我开始深入研究OpenID和Keycloak。在C++中开发意味着我几乎没有对 OpenID 的库支持,但我(希望(所有低级细节都在工作(例如正确的 JWT 验证(。我必须完成所有的通信流程并重定向自己。

如此多的背景。请记住这一点,因为我需要了解并实现通常库会为开发人员隐藏的细节。

我的申请中有三方:

  • 一个网络客户端 W
  • 微塞里斯 A
  • 微服务 B

这三者之间的一般通信:Web 客户端 W 可以是前端 UI,也可以是仅使用 API 即服务的移动设备,而无需任何类型的前端。W 连接到微服务 A 以操作和使用其中的数据。微服务 A 与微服务 B 交换数据,反之亦然。W 不需要了解 B。

到目前为止,我想到了以下架构:

  • 对于 Web 客户端到微服务 A 通信,我将在 Keycloak 中使用访问类型为"公共"的专用用户和客户端来允许用户/pw 登录
  • 对于微服务 A 到微服务 B 的通信,我会使用访问类型持有者,因为它们从不启动任何登录

如果您认为这听起来不对,请告知。然而,我的实际问题是需要什么样的登录流程以及我可能会错过的中间步骤:

  1. 是否可以在微服务A https://servicea.local/login 上有一个用于登录的端点,该端点将 Web 客户端的请求重定向到 OpenID/Keycloak。 例如,Web 客户端将用户名、密码、客户端 ID 和授权类型发送到 OpenID 令牌请求端点 http://127.0.0.1:8080/auth/realms/somerealm/protocol/openid-connect/token?

  2. 客户端是否应该获取令牌并将其作为授权令牌添加到所有后续调用中?

  3. 微服务是否应该实现回调来检索授权信息?

  4. 是否应该改为更改客户端到服务通信的流,以提供与访问令牌交换的服务访问代码?

我的目标是建立一个架构,其中您的C++ API的作用只是验证令牌并提供数据。

不过,客户端是一个单独的解决方案,需要自己的代码来登录+处理授权代码和获取令牌。这不应该涉及您的 API - 因此要回答您的问题:

  1. 不推荐
  2. 是的

如今,所有登录都应通过系统浏览器进行,无论您是在编写其中任何一个。此客户端代码可能不是C++,并且通常需要比构建 API 更多的工作:

  • 网页用户界面
  • 移动用户界面
  • 控制台/桌面应用程序

如果它有帮助,我的博客有很多关于这些流程的文章和代码示例。在下面的帖子中,请注意,直到 Web 客户端完成所有登录处理后,直到步骤 13 才会调用 API。

OAuth 消息工作流

身份验证(委托给Keycloak(,然后获取令牌应该由您的UI通过直接联系keycloak来完成,并且该令牌应该从UI to A to B传递

以下是 keycloak 提供的 OIDC 端点

https://www.keycloak.org/docs/latest/server_admin/index.html#keycloak-server-oidc-uri-endpoints

最新更新