【问题标题】:Keycloak: authZ with nodeJSKeycloak:使用 nodeJS 的 authZ
【发布时间】:2018-04-27 05:26:20
【问题描述】:

我正在尝试使用 keycloak 授权机制来保护 REST API。 我的 API 在 NodeJS 中,带有 express。
假设我有这个 API:

http://www.example.com/api/v1/houses

端点支持 GET/POST/PUT/DELETE。 房子有名字和主人:

{
  name: 'myhouse',
  owner: 'smith'
}

每个人都可以查看房屋。您还可以创建房屋,并自动成为所有者。只有所有者才能删除房屋。类似于photoz example

在仅承载模式下使用 Keycloak Connect 可与 nodeJS express 配合使用:

router.get('/houses*', keycloakProtect(), myHandler)

但这仅提供身份验证,不提供授权。基本上它只是检查您是否提供了正确的令牌。 KeycloakProtect 提供了一种基本的授权机制,仅基于角色名称。 但是,我想使用客户端授权的全部功能(包括资源、范围和策略)...... 是否有任何 NodeJS 支持?如果没有,如何使用 Keycloak API?

【问题讨论】:

  • 如何在 node.js 应用程序中执行策略?
  • Keycloak 的 nodejs 库现已更新为 keycloak.enforcer(...) 函数,应该可以满足您的需求

标签: node.js rest express keycloak role-based-access-control


【解决方案1】:

我使用 API 找到了答案的开头:

TOKEN=`curl -X POST  -H "Content-Type: application/x-www-form-urlencoded" -d 'username=username&password=password&grant_type=password&client_id=myclient&client_secret=myclientsecret' "http://localhost:8080/auth/realms/myrealm/protocol/openid-connect/token" | jq .access_token -r`

curl -X POST -H "Content-Type: application/json" -H "Authorization: Bearer $TOKEN" -d '{
    "permissions" : [
        {
            "resource_set_name" : "Houses",
            "scopes" : [
                "view"
            ]
        }
    ]
}'  "http://localhost:8080/auth/realms/myrealm/authz/entitlement/myclient"

如果授权,第二个呼叫将回复 200,否则将回复 403。

要在 Keycloak 中定义授权策略,请在您的客户端中打开“授权”。在新的“授权”标签上:

  • 设置
    • 启用“远程资源管理”
  • 资源 创建一个:
    • 名称:房屋
    • 范围:创建、查看、更新、删除
    • uri: /houses/*
  • 作用域创建 4 个作用域:创建、查看、更新、删除
  • 政策 创建基于角色的政策:
    • 名称:public_role_policy
    • 说明:用户必须具有“公共”角色才能被允许
    • 领域角色:公共
  • 权限创建一个:
    • 名称:“公共角色允许查看房屋”
    • 资源:房屋
    • 范围:视图
    • 政策:public_role_policy

您还必须创建一个“公共”领域角色并将其提供给您的用户。

接下来您需要做的是远程创建资源。 首先获取一个客户端令牌:

TOKEN=`curl -X POST \
-H "Content-Type: application/x-www-form-urlencoded" \
-d 'grant_type=client_credentials&client_id=myclient&client_secret=myclientsecret'
"http://localhost:8080/auth/realms/${realm_name}/protocol/openid-connect/token" | jq .access_token -r`

然后创建资源:

curl -X POST "http://localhost:8080/auth/realms/myrealm/authz/protection/resource_set" -H "Authorization: Bearer $TOKEN" -d '{
    "name": "My house",
    "uri": "/houses/123",
    "scopes": [
      {
        "id": "da776461-c1f5-4904-a559-1ca04d9f53a9",
        "name": "view"
      },
      {
        "id": "2615157c-f588-4e2b-ba1c-720fe8394215",
        "name": "manage"
      }
    ],
    "owner": "0892e431-5daf-413e-b4cf-eaee121ee447"
}'

【讨论】:

  • 当我查询entitlement api 时,我得到了 404。你能和我分享你的领域配置吗?
  • @mateeyow 在最近版本的 Keycloak 授权端点已被删除。它已与令牌端点合并。令牌端点也可以为您提供授权:keycloak.org/docs/latest/authorization_services/…
【解决方案2】:

我做了类似的任务。但我不创造资源。也许你的方法更好。不知道。

要检查房子的主人,我将使用数据库检查 - 只需从 Keycloak 令牌获取用户登录名,然后检查应用程序数据库中的用户是否拥有指定的房子。

v-ladynev/keycloak-nodejs-example

【讨论】:

  • 如何在 node..js 应用程序中启用策略执行?我必须执行 keycloak cosole 的政策。
  • @SivaThangaraj 我用这个配置github.com/v-ladynev/…
  • 谢谢。但是如何在不使用数据库的情况下在应用程序中执行策略?
  • stackoverflow.com/questions/53722033/…你能解释一下适配器的配置吗?
猜你喜欢
  • 2013-01-28
  • 2021-08-01
  • 1970-01-01
  • 2022-01-15
  • 1970-01-01
  • 2019-05-15
  • 2016-06-02
  • 2020-09-29
  • 1970-01-01
相关资源
最近更新 更多