我喜欢从我自己的应用程序管理 keycloak:创建用户和客户端,显示用户和客户端。由于这不是真正的用户,而是一台机器,我想使用具有客户端凭据授权的服务帐户,如如何在没有管理员帐户的情况下通过 REST 获取 Keycloak 用户中所述。为了实现这一点,我:
请求在标头中编码为“用户名:密码”base64 的访问令牌
curl -X POST 'http://accounts.d10l.de/auth/realms/d10l/protocol/openid-connect/token' \
-H "Content-Type: application/x-www-form-urlencoded" \
-H "Authorization: Basic ZGV2ZWxvcGVyLXBvcnRhbDpmZGRmYzM4Yy05MzAyLTRlZmQtYTM3Yy1lMWFmZGEyMmRhMzc=" \
-d 'grant_type=client_credentials' \
| jq -r '.access_token'
curl -I GET 'http://accounts.d10l.de/auth/admin/realms/d10l/users/' \
-H "Authorization: Bearer eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICIxRVdoNENFUjIweDY5SlBCekU4dU9GdXF4R2NVNlVfWmpTNTQ5bmd2QjNjIn0.eyJqdGkiOiI0NDM0ZDFhNS0xZTA5LTQ4MzQtYWI2Yy0zOTk1YmEwMTgxMzAiLCJleHAiOjE1MzY0MzYwMDEsIm5iZiI6MCwiaWF0IjoxNTM2NDM1NzAxLCJpc3MiOiJodHRwOi8vYWNjb3VudHMuZDEwbC5kZS9hdXRoL3JlYWxtcy9kMTBsIiwiYXVkIjoiZGV2ZWxvcGVyLXBvcnRhbCIsInN1YiI6IjliYWI0YWM1LTRiNWMtNGIxOS05ZTc3LWFjOWFmNzlkNzFhZiIsInR5cCI6IkJlYXJlciIsImF6cCI6ImRldmVsb3Blci1wb3J0YWwiLCJhdXRoX3RpbWUiOjAsInNlc3Npb25fc3RhdGUiOiIyOWM2YWI3Mi05N2RiLTQ2NWUtYTE1Yy03ZWE5NzA0NmZlYzQiLCJhY3IiOiIxIiwiYWxsb3dlZC1vcmlnaW5zIjpbXSwicmVzb3VyY2VfYWNjZXNzIjp7fSwic2NvcGUiOiJlbWFpbCBwcm9maWxlIiwiY2xpZW50SWQiOiJkZXZlbG9wZXItcG9ydGFsIiwiY2xpZW50SG9zdCI6IjE3Mi4xNy4wLjEiLCJlbWFpbF92ZXJpZmllZCI6ZmFsc2UsInByZWZlcnJlZF91c2VybmFtZSI6InNlcnZpY2UtYWNjb3VudC1kZXZlbG9wZXItcG9ydGFsIiwiY2xpZW50QWRkcmVzcyI6IjE3Mi4xNy4wLjEiLCJlbWFpbCI6InNlcnZpY2UtYWNjb3VudC1kZXZlbG9wZXItcG9ydGFsQHBsYWNlaG9sZGVyLm9yZyJ9.D_XnpF1rwCayup8h4UXM4AGWkY_xQo40X-yIlWhmqaxkVh1FQy24932VDRCAmxYHcrwazRMqO7snXmre3_8YF5R9Dt8GYjiBorECvQ9X_nBwunmHqnGxIeE64c2GXiz6zSjdgQJQE8fH10NsLyFWHQ-lBPsBwZBsrkKQ5QUEU2qjE7rDRPtYLJPB94BSE4QGfedmRIbvg39snVkClBDUmuBTq_Rc4p7kV69h0a2Mb1sgEr3MdB4RcsOe3gJPZVVtu7gZuGqcAQKMYgtybArF3OXz37w8hjUp6FABxDcvY7K-jsGxXn0hSU0OB7wxAWY9vP4ar4tQYlKxNjs46rPLWw"
但响应是 403:
url: (6) Could not resolve host: GET
HTTP/1.1 403 Forbidden
content-length: 0
date: Sat, 08 Sep 2018 19:42:06 GMT
如何/是否可以通过客户端凭据授权从新服务帐户访问 Admin REST API?
我正在使用keycloak 3.4并spring boot开发一个网络应用程序.我正在使用Active Directory作为用户Federeation来检索所有用户信息.
但是要在我的网络应用程序中使用这些信息,我想我必须将它们保存在"local-webapp"数据库中.
因此,在用户登录后,如何将其保存在我的数据库中?
我正在考虑这样的场景:"我有一个对象A,它引用了用户B,因此我必须在它们之间建立关系.所以我添加了一个外键."
在这种情况下,我需要让我的数据库上的用户.没有?
编辑
为了避免保存我的数据库上的所有用户,我正在尝试使用管理员API,因此我在控制器中添加了以下代码.
我还创建了另一个调用Test所有用户的客户端,这样我可以使用client-id和client-secret.或者有没有办法JWT使用admin api?
客户端:
Keycloak keycloak2 = KeycloakBuilder.builder()
.serverUrl("http://localhost:8080/auth/admin/realms/MYREALM/users")
.realm("MYREALMM")
.username("u.user")
.password("password")
.clientId("Test")
.clientSecret("cade3034-6ee1-4b18-8627-2df9a315cf3d")
.resteasyClient(new ResteasyClientBuilder().connectionPoolSize(20).build())
.build();
RealmRepresentation realm2 = keycloak2.realm("MYREALMM").toRepresentation();
Run Code Online (Sandbox Code Playgroud)
错误是:
2018-02-05 12:33:06.638 ERROR 16975 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Handler dispatch failed; nested exception is java.lang.Error: Unresolved compilation problem:
The method realm(String) is undefined for …Run Code Online (Sandbox Code Playgroud) 我正在使用Keycloak服务器来实现SSO.我能够使用client_credentials流获取特定客户端的访问令牌.
然而,我的观察是,访问令牌被授予内部服务帐户的的客户端.我想获得访问令牌的其他用户存在的领域通过提供一些额外的参数令牌端点.
以下是我使用Postman Chrome扩展程序对令牌端点发出的当前请求:
POST http://localhost:8080/auth/realms/<realm>/protocol/<protocol>/token
x-www-form-urlencoded
grant_type client_credentials
client_id <client_id>
client_secret <client_secret>
Run Code Online (Sandbox Code Playgroud)
如果可能,请告诉我.此外,我想传达一下,这对Keycloak和openid-connect协议来说是全新的.
首先,我对Keycloak非常陌生,请问如果我要问的问题可能是错的。
我已经安装了Keycloak服务器,并且可以使用以下命令访问Web UI:
我的要求是通过将领域用户传递给k Keycloak API来验证领域用户,并从那里获取令牌作为响应,然后将该令牌传递给我的其他Web API调用。
但是我找不到关于如何执行此操作的简单指南...
更新:
从使用UI KEYCLOAK:
到目前为止:
我能够创建一个realm:例如:DemoRealm
在Realm我创建的客户端下:例如:DemoClient
在客户端下,我创建了用户:例如: DemoUser
使用方法POSTMAN:
我也能够成功使用获取令牌
http://localhost:8080/auth/realms/DemoRelam/protocol/openid-connect/token
POST:
{
"grant_type": "client_credentials",
"username": "",
"password": "",
"client_secret":"",
"client_id":"DemoClient"
}
Run Code Online (Sandbox Code Playgroud)
作为回应,我得到了令牌。
{
"access_token": "eyJhbGciOiJSUzI1NiIsINVSHGhepnDu13SwRBL-v-y-04_6e6IJbMzreZwPI-epwdVPQe-ENhpvms2WdGM_DmgMLZ8YQFS4LDl9R7ZHT8AgXe-WCFV6OFkA7zvdeFwQ4kVVZE0HlNgHgoi4DrgMfwwz_ku1yJNJP3ztTY1nEqmA",
"expires_in": 300,
"refresh_expires_in": 1800,
"refresh_token": "eyJhbGciOiJSUzI1NiIsInR5cCIgOiAiSldUIiwia2lkIiA6ICJRRnB5YlloMGVEektIdlhOb3JvaFUxdlRvWVdjdP3vbfvk7O0zvppK9N4-oaUqZSr0smHv5LkuLDQYdPuxA",
"token_type": "bearer",
"not-before-policy": 0,
"session_state": "bb1c586a-e880-4b96-ac16-30e42c0f46dc"
}
Run Code Online (Sandbox Code Playgroud)
此外,我深入研究了更多细节,并找到了此API指南:
http://www.keycloak.org/docs-api/3.0/rest-api/index.html#_users_resource
在本指南中,提到了可以使用“获取用户”来获取领域的用户返回用户列表,并根据查询参数进行过滤
GET /admin/realms/{realm}/users
Run Code Online (Sandbox Code Playgroud)
但是,当我POSTMAN用来获取用户时,我得到了403错误代码。我正在传递与在上一步中获得的身份验证相同的令牌。
http://localhost:8080/auth/admin/realms/DemoRelam/users
Run Code Online (Sandbox Code Playgroud)
谁能指导我?
我有一个关于 Keycloak 和获取访问令牌的问题。
我们的设置如下: · 用户在 Keycloak 中创建和维护 · 资源、策略和权限也在 Keycloak 中维护
我们的用例是:
作为第三方应用程序,我想通过只向 Keycloak 提供用户名来获取特定用户的授权信息(例如基于资源和范围的权限),以便我可以允许或禁止进一步的操作。
更具体地说:在我们的应用程序中,需要根据访问令牌验证对其他服务的每个请求。但我们只有用户名。
现在的问题是:
>我们如何通过只知道用户名来获取用户的访问令牌?
> 有没有办法为这样的用户获取访问令牌?