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的主要内容,如果未能解决你的问题,请参考以下文章
Prisma with Next-Auth,用户创建失败导致Keycloak的api响应键名