直接从 Keycloak 将 IDP 令牌传递到前端

问题描述 投票:0回答:1

我使用React作为前端, Spring boot 作为后端的 OAuth2 资源服务器 Keycloak 作为我的本机授权服务器。

最近我开始使用Keycloak,所以我可能会遗漏一些东西。我的要求是,如果客户端在我的应用程序和 Keycloak 中配置任何 IDP 提供程序( Okta、OneLogin )。然后前端应该获取 IDP 令牌而不是 Keycloak 令牌,并将访问我配置了多租户的后端资源服务器。

在身份提供商部分的高级设置中,有一个存储令牌的选项。经过进一步检查,我发现令牌以 JSON 形式存储在 Keycloak 数据库的一个表中。

此外,Keycloak 有一个 API,可以从该表中获取 IDP 令牌以换取 Keycloak 令牌。 但缺点是前端在收到 Keycloak 令牌后必须在成功的 IDP 身份验证后进行额外的 API 调用。

基本上,一旦 IDP 身份验证成功,前端必须直接获取 IDP 令牌,而不是获取 Keycloak 令牌。

我已经浏览了他们的文档,但找不到任何可行的解决方案来解决我的问题。任何帮助表示赞赏

谢谢。

参考-2

oauth-2.0 keycloak openid-connect saml-2.0 keycloak-rest-api
1个回答
0
投票

如果您在 Keycloak 中联合外部身份,则不需要在资源服务器中进行多租户:交付的客户端是 Keycloak 令牌(来自外部 IDP 的令牌仅在这些 IDP 和 Keycloak 之间交换)。

如果相反,您的客户可以直接在多个 IDP 上获取代币(不使用从集中式发起的“登录方式...”),那么

  • Keycloak 不会知道这些令牌
  • 资源服务器需要多租户

最简单的解决方案是第一个,其中不同的身份提供商在 Keycloak 中配置(而不是在您的客户端中):所有客户端和资源服务器都必须了解单个授权服务器(Keycloak )和单一的私人债权结构。

最后,根据最新建议,移动应用程序和浏览器中运行的基于 Javascript 的前端都不应配置为 OAuth2 客户端,也不应访问令牌。因此,除非您使用 Next.js 且 OAuth2 客户端位于应用程序的服务器端(节点)部分,否则您应该考虑在前端和资源服务器之间使用附加层。例如

spring-cloud-gateway
spring-boot-starter-oauth2-client
TokenRelay
过滤器(在将请求从前端转发到资源服务器之前,用会话中的访问令牌替换会话 cookie)。

© www.soinside.com 2019 - 2024. All rights reserved.