Keycloak:使用 nodeJS 的 authZ

Posted

技术标签:

【中文标题】Keycloak:使用 nodeJS 的 authZ【英文标题】:Keycloak: authZ with nodeJS 【发布时间】: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(...) 函数,应该可以满足您的需求 【参考方案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/… 谢谢。但是如何在不使用数据库的情况下在应用程序中执行策略? ***.com/questions/53722033/…你能解释一下适配器的配置吗?

以上是关于Keycloak:使用 nodeJS 的 authZ的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak 和 Nginx:auth_request

Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名

Keycloak:使用 nodeJS 的 authZ

NodeJS + Keycloak 没有快递

如何配置 keycloak-(nodejs-)connect 以使用 PKCE?

使用 nginx 反向代理后面的 keycloak 保护 nodejs 中的路由