使用 Keycloak 进行微服务身份验证
Posted
技术标签:
【中文标题】使用 Keycloak 进行微服务身份验证【英文标题】:Microservice authentication with Keycloak 【发布时间】:2021-04-26 23:26:04 【问题描述】:我正在尝试在另一个微服务中验证一个微服务请求,但我找不到任何示例来说明如何在 keycloak 中配置客户端以及如何配置 spring 安全性。这是我要归档的架构:
我已经设法让用户授权工作并保护微服务 A,现在我正在尝试授权来自微服务 B 的请求,但我不知道该怎么做,是否应该在 keycloak 中创建一个专用用户对于微服务 B,或领域中的客户端,或其他一些技术帐户?它是由某个 api 密钥完成的,还是微服务 B 应该以与用户类似的方式请求访问令牌?
我的想法是在 Keycloak 中为微服务 B 创建一个客户端,从 Keycloak 请求访问令牌并将其附加到发送到微服务 A 的每个请求中。
这是正确的方法吗?
是否有一些图书馆解决了这种情况?
我找不到任何与 Spring 进行此类通信的示例,您是否知道任何具有此类示例的存储库?
【问题讨论】:
【参考方案1】:据我了解,您对 MS-A 的前端访问是通过不同的用户帐户(登录名)完成的。但是对于 MS-B 访问 MS-A 来说,MS-B 总是使用同一个帐户(MS-B 服务帐户)就可以了吗?
在这种情况下,我将为此后端身份验证创建第二个客户端,我们将其命名为 backend-client
,并提供以下选项:
OIDC,机密,启用直接访问授权和服务帐户,禁用标准流程
MS-B 现在可以通过对 Keycloak 的简单请求获得访问令牌
curl --request POST \
--url https://keycloak/auth/realms/%realm_name%/protocol/openid-connect/token \
--header 'Accept: */*' \
--header 'Content-Type: application/x-www-form-urlencoded' \
--data 'client_id=backend-client&client_secret=%client_secret%&grant_type=client_credentials'
(不需要用户+密码,所以请保持client_secret
真正安全)
现在需要将访问令牌用于从 MS-B 到 MS-A 的所有请求(Authentication: Bearer %Access-Token%
Header)
我不知道有任何 spring 实现/适配器,但我很确定如果您搜索 Direct Access Grants
,您会找到合适的解决方案
【讨论】:
以上是关于使用 Keycloak 进行微服务身份验证的主要内容,如果未能解决你的问题,请参考以下文章
通过 openresty 使用 keycloak 对 websocket 进行身份验证
Keycloak Angular 2 - 检查身份验证状态 Keycloak 对象
apache shiro:在 shiro.ini 中添加啥以使用 JWT 和 keycloak 作为授权服务器进行客户端身份验证