4

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

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

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

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

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

在仅承载模式下使用Keycloak Connect适用于 nodeJS express:

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

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

4

2 回答 2

3

我使用 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:/房屋/*
  • 范围创建 4 个范围:创建、查看、更新、删除
  • 策略创建基于角色的策略:
    • 名称:public_role_policy
    • 描述:用户必须具有角色“public”才能被允许
    • 领域角色:公共
  • 权限创建一个:
    • 名称:“公共角色允许查看房屋”
    • 资源:房屋
    • 范围:查看
    • 政策: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"
}'
于 2017-11-14T10:22:44.477 回答
1

我在类似的任务中走得更远。但我不创造资源。也许你的方法更好。不知道。

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

v-ladynev/keycloak-nodejs-example

于 2017-11-20T10:54:05.140 回答