【发布时间】:2022-08-16 23:57:14
【问题描述】:
我有一个应用程序,它由一个前端和几个后端服务组成。身份验证是通过 Keycloak 完成的。 工作流程如下所示: 用户登录前端并从 Keycloak 获取令牌。此令牌随每个请求一起发送到后端。
下图解释了当前架构:
在 Keycloak 我有以下客户:
1.前端
- 访问类型:公共
- 客户端协议:openid-connect
2.核心服务
- 访问类型:仅承载
- 客户端协议:openid-connect
3. 用户服务
- 访问类型:仅承载
- 客户端协议:openid-connect
我现在如何验证服务之间的调用?
我会想象像服务帐户这样的东西,它们有可能独立于前端的承载令牌相互调用。问题是这两个服务都可以从前端调用,也可以在彼此之间调用。
编辑:
我的 API 是用 NestJS 编写的。
目前我没有在请求中添加任何内容,也没有在界面上进行任何额外的配置。所以我将@Resource(\'user-service\')-Annotation 添加到Controller 并将@Scope()-Annotation 添加到Endpoint。
之后我不会立即收到错误并调用端点。我可以记录逻辑已执行。但作为回应,我仍然收到 401 Unauthorized Error。
我需要指定范围还是需要在@Resource-Annotation 中添加什么?
编辑2:
我将尝试通过许多屏幕截图向您展示我目前的情况。
初始情况
这又是你的画。对我来说,第 1-5 点有效,第 8 点有效,即使我不调用其他服务。
我的配置
这有效,我有以下配置:
只是前端和核心服务
对于核心服务(gutachten-backend),我不需要为此做任何进一步的配置。我也有 2 个不同的角色,我可以在 API 中指定它们。
我使用 Postman 向 API 发送请求并从 http://KEYCLOAK-SERVER_URL/auth/realms/REALM_NAME/protocol/openid-connect/token 获取令牌。
这是我的两种测试方法。我打电话给第一个,它有效。记录以下内容。表示已验证收到令牌并获得访问权限:
调用用户服务
现在我调用第二种方法。此方法调用用户服务。
这是我在核心服务中的要求: 我不会在我的请求中添加任何其他内容。就像标题中的不记名令牌一样。
用户服务中的端点只是一个记录消息的测试方法。
我现在已经尝试了一些资源、策略和权限。
资源
政策
允许
和类似的客户许可
问题和想法
- 第一张图的所有步骤似乎都可以工作,除了 6 和 7
- 我是否需要在从核心服务到用户服务的请求中添加更多信息?
- 如何处理root url和resource url?
- 在 API 的代码中,是否需要额外配置端点并指定具体的资源和策略? (NestJS 提供了为控制器提供
@Resource(\'<name>\')和为端点提供@Scopes([<list>]))的可能性 此外,通过在 NestJS 中设置 keyacloak 的教程,我打开了以下配置:
这增加了一个全局级别的资源保护,这是允许的。 仅使用 @Resource 注释的控制器和 带有@Scopes 的方法由这个守卫处理。
标签: authentication jwt nestjs keycloak service-accounts