如何为两个受保护服务配置Keycloak Client及令牌共享方案
问题解决方案
一、让单个访问令牌同时适配两个服务的方法
方案1:用共享客户端作用域统一权限
在Keycloak里创建一个共享客户端作用域,把licensing和organization服务需要的角色权限都添加到这个作用域中。接着把该作用域分别关联到两个服务对应的Keycloak客户端上,并设置为「默认包含」或「强制包含」的作用域。这样用户请求licensing服务的令牌时,Keycloak会自动将这个共享作用域的权限注入令牌,organization服务验证令牌时就能识别到所需的权限。
方案2:配置资源服务器接受多受众
如果不想调整客户端作用域,也可以让两个服务的资源服务器都接受对方的客户端ID作为合法受众。比如在licensing服务的资源服务器配置中,将organization的客户端ID加入allowed-audiences列表,反之亦然。同时需要在Keycloak的客户端设置里,把两个服务的客户端ID都添加到「令牌受众」中,确保生成的令牌aud字段包含两个值,这样两个服务都能认可该令牌的合法性。
二、将两个服务配置为同一Keycloak Client时的基础URL设置
Keycloak客户端的基础URL主要用于授权码流程的回调、登出跳转等场景,对于作为资源服务器的licensing和organization来说,核心是令牌的客户端ID匹配,基础URL的设置相对灵活:
- 可以直接设置为其中一个服务的地址,比如
http://localhost:8090,然后在「有效重定向URI」中添加两个服务的路径规则:http://localhost:8090/*和http://localhost:8091/*,确保授权流程的回调能正常触发。 - 如果不需要授权码流程(仅服务间调用),基础URL甚至可以留空,或者设为通用路径如
http://localhost,只要「有效重定向URI」覆盖两个服务的必要路径即可。
内容的提问来源于stack exchange,提问作者alpha
相关产品推荐
相关产品推荐

