【问题标题】:Keycloak: Authorization between services and the public frontendKeycloak:服务和公共前端之间的授权
【发布时间】:2022-08-16 23:57:14
【问题描述】:

我有一个应用程序,它由一个前端和几个后端服务组成。身份验证是通过 Keycloak 完成的。 工作流程如下所示: 用户登录前端并从 Keycloak 获取令牌。此令牌随每个请求一起发送到后端。

下图解释了当前架构:

在 Keycloak 我有以下客户:

1.前端

  • 访问类型:公共
  • 客户端协议:openid-connect

2.核心服务

  • 访问类型:仅承载
  • 客户端协议:openid-connect

3. 用户服务

  • 访问类型:仅承载
  • 客户端协议:openid-connect

我现在如何验证服务之间的调用?

我会想象像服务帐户这样的东西,它们有可能独立于前端的承载令牌相互调用。问题是这两个服务都可以从前端调用,也可以在彼此之间调用。

编辑:

我的 API 是用 NestJS 编写的。

用户服务的API:

这就是我在核心服务中调用用户服务的方式:

这是我的用户服务的密钥斗篷配置:

目前我没有在请求中添加任何内容,也没有在界面上进行任何额外的配置。所以我将@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


    【解决方案1】:

    钥匙斗篷令牌验证 API可以做到。

    这是资源访问权限授权的架构之一。

    在 Core Service 和 User Service 之间,Core Service 需要验证 Keycloak 的 access-token。 这意味着此令牌可以访问用户服务 API Yes(Allow) 或 No(Deny)

    这是API format

    curl -X POST \
      http://${host}:${port}/realms/${realm}/protocol/openid-connect/token \
      -H "Authorization: Bearer ${access_token}" \
      --data "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
      --data "audience={resource_server_client_id}" \
      --data "permission=Resource A#Scope A" \
      --data "permission=Resource B#Scope B"
    

    演示 Keycloak 令牌网址:本地主机:8180

    授权启用领域:测试

    授权启用客户端:核心服务

    客户资源:资源:用户服务

    用户 1:可以访问它(允许) 密码:1234

    用户 2:可以访问它(允许) 密码:1234

    脚步

    获取用户访问令牌(而不是登录)->

    1. 准备工作 准备在 Postman 中分配访问令牌(命名用户令牌)变量

      var jsonData = JSON.parse(responseBody);
      postman.setEnvironmentVariable("user-token", jsonData.access_token);
      

      从 Keycloak UI 获取令牌 URL,单击端点

      1. 获取 User1 的访问令牌 在授权选项卡中使用带有 {{user-token}} 的 Bearer Token 选项

      1. 使用从核心服务到 Keycloak 的 user1 令牌进行验证 从 Keycloak (ALLOW) 返回 200 OK - 这是我架构中的第 4 圈和第 5 圈。 所以核心服务将 API 调用转发给用户服务以访问服务笔记-需要完成 Keycloak 权限设置

      1. 使用从核心服务到 Keycloak 的 user2 令牌进行验证 也从 Keycloak (Allow) 返回 200 OK。 所以核心服务返回一个错误给前端,比如这个用户不能访问用户服务的资源。

      更多详细信息在here

      密钥斗篷权限设置

      1. 创建客户端

      2. 创建客户资源

      3. 添加客户端角色

      4. 添加客户端策略

      5. 添加权限

      6. 所有用户映射到客户端角色

        这是 Keycloak 中的配置 创建客户端

        创建客户资源

        添加客户端角色

        添加客户端策略 - 基于角色

        添加权限

        所有用户映射到客户端角色 - 任何用户,如果您想添加以访问资源。

    【讨论】:

    • 谢谢你的详细回答。到目前为止,我已经管理了配置。我还有一个关于政策的问题。您已创建适用于某些用户的策略。无论用户调用 api,我都希望允许来自服务的每个调用。然后我创建一个“客户端策略”并在核心服务中指定“用户服务”是否正确?
    • 但是我仍然收到 401 未经授权的错误。我用更多细节编辑了我的问题。如果你知道这个问题的答案会很棒
    • @ManuelWolf,添加了更多细节以避免 401 错误。希望能帮上忙。如果仍然是 401 错误,请告诉我哪一步出现 401 错误。此更改支持所有用户。我没有经验nestJs + Keycloak。 NestJS 使用哪个中间件访问 Keycloak?我会尝试,但这需要时间,如果我成功了,我会再次更新。
    • 我现在在 Edit 2 下添加了一个希望可以理解的详细描述。Für NestJS 我使用“nest-keycloak-connect”(npmjs.com/package/nest-keycloak-connect
    猜你喜欢
    • 2019-04-06
    • 2020-08-12
    • 1970-01-01
    • 2018-10-12
    • 1970-01-01
    • 2020-09-13
    • 1970-01-01
    • 2017-10-30
    • 2018-04-29
    相关资源
    最近更新 更多