首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Keycloak:使用nodeJS的authZ

Keycloak:使用nodeJS的authZ
EN

Stack Overflow用户
提问于 2017-11-14 18:04:40
回答 2查看 2.7K关注 0票数 4

我正在尝试使用密钥罩授权机制来保护REST API。我的应用编程接口是带有express的NodeJS。

假设我有这个API:

代码语言:javascript
复制
http://www.example.com/api/v1/houses

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

代码语言:javascript
复制
{
  name: 'myhouse',
  owner: 'smith'
}

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

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

代码语言:javascript
复制
router.get('/houses*', keycloakProtect(), myHandler)

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

EN

回答 2

Stack Overflow用户

发布于 2017-11-14 18:22:44

我使用API找到了答案的开头:

代码语言:javascript
复制
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

  • Enable“远程资源启用

  • Resource create one:删除uri名称: Houses
  • scopes:创建,查看,更新,删除
  • uri: /houses/*

  • Scopes创建4个作用域: create、view、update、delete
  • Policies创建基于角色的策略:公共角色名称: public_role_policy
  • description:用户必须具有角色"public“才能成为allowed
  • realm角色: public

  • Permissions使用:公共角色名称:"public role允许查看houses"
  • resource: Houses
  • scopes:查看
  • 策略:public

您还必须创建一个领域角色"public“并将其提供给您的用户。

接下来,您需要做的是远程创建资源。首先获取客户端令牌:

代码语言:javascript
复制
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`

然后创建资源:

代码语言:javascript
复制
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"
}'
票数 3
EN

Stack Overflow用户

发布于 2017-11-20 18:54:05

对于类似的任务,我走得更远了一点。但我不会创造资源。也许你的方法更好。我也不知道。

要检查房屋的所有者,我将使用数据库检查-只需从Keycloak令牌获得用户登录,并检查应用程序数据库中指定的房屋是否属于该用户。

v-ladynev/keycloak-nodejs-example

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47282818

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档