基于微服务的环境中的 Keycloak 身份验证流程
Posted
技术标签:
【中文标题】基于微服务的环境中的 Keycloak 身份验证流程【英文标题】:Keycloak authentication flow in a microservices based environment 【发布时间】:2020-05-25 22:43:51 【问题描述】:我想在基于微服务的环境中使用 Keycloak,其中身份验证基于 OpenID 端点 REST 调用(“/token”,不重定向到 keycloak 登录页面),我想到的流程是这样的: 1. 前端 SPA 从“/token”端点检索令牌并存储在浏览器的 localStorage 中,然后随每个请求一起发送。 2.网关级认证:Acess Token从前端传递给网关,网关咨询Keycloak服务器检查该token是否仍然有效(未被注销端点调用失效)。 3.基于微服务的授权:Acess Token从网关传递到微服务,使用Spring Boot适配器,微服务离线检查令牌的签名(仅承载客户端?)然后根据令牌中的角色进行授权. 我的问题是:这个流程是否有意义,或者你能建议另一个流程吗?使用什么类型的 Keycloak 客户端?使用 Spring Boot Adapter 传递令牌的理想方法是什么,首先应该这样做吗?请记住,我不是 Keycloak 专家,我已经进行了研究,但仍有疑问。
【问题讨论】:
建议使用授权流而不是隐式流。我建议您阅读以下内容:***.com/a/54924220/1540748 【参考方案1】:你的前端 SPA 应该是 public-client,springboot 微服务应该是 Bearer only Client,Gateway 可以是 Confidential Client。
您可以查看 Keycloak 提供的 oidc adapters。对于 springboot,您使用 keycloak 提供的适配器
使用api网关的类似解决方案讨论here
【讨论】:
没错,这就是我想做的。我有一些问题: 1. 为什么我需要一个用于 SPA 的公共客户端,因为我将使用 OID '/token' 端点来检索令牌(没有重定向到 keycloak 登录页面,我会自己制作) 2. 我知道微服务只是不记名的,因此令牌的签名是离线验证的,但是对于网关,它是否必须通过登录 KC 服务器来检查令牌是否未被“无效”每个请求,这很多吗?你分享的帖子并没有真正解决我的问题。 如果您不使用公共客户端,您将如何以及在何处将客户端密码存储在您的 SPA 中?网关可以验证从 SPA 收到的 JWT 上的签名。 我将机密客户端的秘密存储在 SPA 的配置文件中。根据您的回复,我认为这是一种不好的做法。 不推荐用于可通过 Internet 访问的应用程序。以上是关于基于微服务的环境中的 Keycloak 身份验证流程的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Keycloak 和 PKCE 流实现 React SPA 身份验证?
Spring Keycloak 身份验证 - 为 Web 应用程序和 Web 服务提供服务