我使用React作为前端,Sping Boot 作为后端的OAuth2资源服务器,Keycloak作为我的本地授权服务器。
最近我开始使用Keycloak,所以我可能会错过一些东西。我的要求是,如果客户端在我的应用程序和Keycloak中配置任何IDP提供程序(Okta,OneLogin)。然后,前端应该获得IDP令牌而不是Keycloak令牌,并将在我配置了多租户的后端访问我的资源服务器。
在“身份提供者”部分的高级设置中,有一个存储令牌的选项。在进一步检查后,我发现令牌被存储为Keycloak数据库中的一个表中的JSON。
此外,Keycloak有一个API,它将从该表中获取IDP令牌以交换Keycloak令牌。但缺点是前端必须在收到Keycloak令牌后对成功的IDP身份验证进行额外的API调用。
基本上,一旦IDP认证成功,前端必须直接获取IDP令牌,而不是获取Keycloak令牌。
我看了他们的文档,找不到任何可行的解决方案。如有任何帮助,我们将不胜感激
谢谢.
参考文件-2
1条答案
按热度按时间rwqw0loc1#
如果你在Keycloak中导入外部身份(就像你的问题中的屏幕截图所暗示的那样),你不需要在资源服务器中使用多租户:客户端仅由Keycloak颁发令牌。来自外部IDP的令牌仅在这些IDP和Keycloak之间交换(客户端和资源服务器都不会看到它)。
如果相反,您的OAuth2客户端可以直接从多个IDP获取令牌(不使用Keycloak登录表单上的“login with.”),那么
最简单的解决方案是第一个,其中不同的身份提供者在Keycloak中配置(而不是在您的客户端中):所有的客户端和资源服务器都必须知道单个授权服务器(Keycloak)和单个私有声明结构。
当用户“使用..."登录时,Keycloak将从ID token / userinfo端点导入数据到自己的数据库中。因此,Keycloak为该用户进一步颁发的令牌应该包含与您在Keycloak的
Identity providers
选项卡中为该IDP配置的作用域相对应的数据。PS
根据最新的建议,无论是移动的应用程序还是在浏览器中运行的基于JavaScript的前端都不应配置为OAuth2客户端,也不应访问令牌。因此,除非您使用Next.js,OAuth2客户端位于应用程序的服务器端(节点)部分,否则您应该考虑在前端和资源服务器之间使用额外的层。例如,
spring-cloud-gateway
与spring-boot-starter-oauth2-client
和TokenRelay
过滤器(在将请求从前端转发到资源服务器之前,将会话cookie替换为会话中的访问令牌)。