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-示例