我正在尝试使用密钥罩授权机制来保护REST API。我的应用编程接口是带有express的NodeJS。
假设我有这个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来实现?
发布于 2017-11-14 18:22:44
我使用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中定义授权策略,请在您的客户端中打开“授权”。在新的"Authorization“选项卡上:
远程资源启用"remote
您还必须创建一个领域角色"public“并将其提供给您的用户。
接下来,您需要做的是远程创建资源。首先获取客户端令牌:
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-20 18:54:05
对于类似的任务,我走得更远了一点。但我不会创造资源。也许你的方法更好。我也不知道。
要检查房屋的所有者,我将使用数据库检查-只需从Keycloak令牌获得用户登录,并检查应用程序数据库中指定的房屋是否属于该用户。
https://stackoverflow.com/questions/47282818
复制相似问题