【发布时间】:2020-05-26 08:44:48
【问题描述】:
我正在用 C++ 开发一个微服务(出于低延迟的原因),并且我开始深入研究 OpenID 和 Keycloak。用 C++ 开发意味着我几乎没有对 OpenID 的库支持,但我(希望)所有的低级细节都在工作(比如正确的 JWT 验证)。我必须完成所有的通信流程并重定向自己。
作为背景。请记住这一点,因为我需要了解和实现通常库会为开发人员隐藏的细节。
我的申请中有三方:
- Web 客户端 W
- Microserice A
- 微服务 B
这三者之间的一般通信:Web 客户端 W 可以是前端 UI,也可以是仅将 API 用作服务的移动设备,而无需任何类型的前端。 W 连接到微服务 A 以操作和使用其中的数据。微服务 A 与微服务 B 交换数据,反之亦然。 W不需要知道B。
到目前为止,我想到了以下架构:
- 对于 Web 客户端到微服务的通信,我会使用 Keycloak 中访问类型为“公共”的专用用户和客户端来允许用户/密码登录
- 对于微服务 A 到微服务 B 的通信,我会使用 Access Type Bearer,因为它们从不启动任何登录
如果您认为这听起来不对,请提出建议。然而,我的实际问题是需要什么样的登录流程以及我可能会错过的步骤:
是否可以在微服务 A https://servicea.local/login 上有一个登录端点,它将 Web 客户端的请求重定向到 OpenID / Keycloak。例如。 Web 客户端向 OpenID 令牌请求端点 http://127.0.0.1:8080/auth/realms/somerealm/protocol/openid-connect/token 发送用户名、密码、客户端 ID 和授权类型?
客户端是否应该获取令牌并将其作为授权令牌添加到所有后续调用中?
微服务是否应该实现回调来获取授权信息?
是否应该更改客户端以服务通信的流程,以向服务提供访问代码,该服务与访问令牌交换?
【问题讨论】:
标签: oauth-2.0 openid openid-connect keycloak