Keycloak:authZ和nodeJS

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

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

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

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

每个人都可以看房子。 你也可以创build房屋,并自动成为所有者。 只有业主可以删除一个房子。 这和photoz例子很相似。

使用Keycloak连接仅在bearer-only模式下使用nodeJS express:

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

但是这只提供了authentication,而不是授权。 基本上它只是检查你提供了正确的标记。 KeycloakProtect仅提供基于angular色名称的基本授权机制。 但是,我想充分利用客户端授权(包括资源,范围和策略)…是否有任何NodeJS支持? 如果不是,如何使用Keycloak API呢?

我发现使用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中定义授权策略,请打开客户端的“授权”。 在新的“授权”选项卡上:

  • 设置
    • 启用“远程资源pipe理”
  • 资源创build一个:
    • 名称:房屋
    • 范围:创build,查看,更新,删除
    • uri:/房屋/ *
  • 范围创build4个范围:创build,查看,更新,删除
  • 策略创build基于angular色的策略:
    • 名称:public_role_policy
    • 描述:用户必须具有“公开”angular色才能被允许
    • 领域angular色:公共
  • 权限创build一个:
    • 名称:“公共angular色允许查看房屋”
    • 资源:房屋
    • 范围:视图
    • 政策:public_role_policy

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

接下来你需要做的是远程创build资源。 首先得到一个客户令牌:

 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` 

然后创build资源:

 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" }' 

我进一步采取了类似的任务。 但是我不创造资源。 也许你的方法更好。 不知道。

要检查房屋的主人,我要使用数据库检查 – 只需从Keycloak令牌获得用户login,并检查指定的房屋是否由用户在应用程序数据库中拥有。

V-ladynev / keycloak-的NodeJS-示例