标签: keycloak

使用服务帐户访问 Keycloak REST Admin API(客户端凭据授予)

我喜欢从我自己的应用程序管理 keycloak:创建用户和客户端,显示用户和客户端。由于这不是真正的用户,而是一台机器,我想使用具有客户端凭据授权的服务帐户,如如何在没有管理员帐户的情况下通过 REST 获取 Keycloak 用户中所述。为了实现这一点,我:

  1. 创造一个境界
  2. 在真正的内部创建了一个客户端
  3. 将客户端的访问类型配置为“机密”保存并激活保存后将出现的“服务帐户已启用”选项。
  4. 在范围内启用“真实管理”的客户端角色(见截图) 在此处输入图片说明

  5. 请求在标头中编码为“用户名:密码”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'

  6. 尝试使用访问令牌访问用户:

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 keycloak-services

12
推荐指数
1
解决办法
2万
查看次数

通过Spring Boot(Security)和Keycloak启用角色身份验证?

我正在尝试做一件简单的事情。

想要向单个端点发出请求并发送承载令牌(来自客户端),我希望验证该令牌,并取决于端点上keycloak接受/拒绝请求上分配的角色。

我遵循了许多教程甚至书籍,但是其中大多数我根本不理解。

遵循此设置我的密钥斗篷信息(领域,角色,用户) https://medium.com/@bcarunmail/securing-rest-api-using-keycloak-and-spring-oauth2-6ddf3a1efcc2

所以,

我基本上是通过客户端,具有特定角色“用户”的用户来设置我的密钥斗篷,并像这样进行配置:

@Configuration
@KeycloakConfiguration
//@ComponentScan(basePackageClasses = KeycloakSecurityComponents.class)
public class SecurityConf extends KeycloakWebSecurityConfigurerAdapter
{
    /**
     * Registers the KeycloakAuthenticationProvider with the authentication manager.
     */
    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.authenticationProvider(keycloakAuthenticationProvider());
    }

    /**
     * Defines the session authentication strategy.
     */
    @Bean
    @Override
    protected SessionAuthenticationStrategy sessionAuthenticationStrategy() {
        return new RegisterSessionAuthenticationStrategy(new SessionRegistryImpl());
    }

    @Bean
    public KeycloakSpringBootConfigResolver KeycloakConfigResolver() {
        return new KeycloakSpringBootConfigResolver();
    }

    @Bean
    public FilterRegistrationBean keycloakAuthenticationProcessingFilterRegistrationBean(
            KeycloakAuthenticationProcessingFilter filter) {
        FilterRegistrationBean registrationBean = new FilterRegistrationBean(filter);
        registrationBean.setEnabled(false);
        return …
Run Code Online (Sandbox Code Playgroud)

java spring spring-boot keycloak

12
推荐指数
3
解决办法
1461
查看次数

在 Keycloack 上创建一个用户,包括 curl 命令的密码

我尝试使用 CURL 命令在 keycloak 上创建用户(创建时不提供任何密码),成功,但无法知道登录密码。那么,如何在创建时为用户提供密码。以及如何在keycloak中为新用户设置默认密码

我使用此链接使用 curl创建用户从 curl 命令在 Keycloack 上创建用户

curl jira jira-rest-api keycloak keycloak-services

12
推荐指数
1
解决办法
6402
查看次数

Keycloak:如何为登录的 Windows 用户自动进行身份验证?

我正在尝试创建一个C# 应用程序,它将使用Keycloak进行身份验证。目前,我可以通过发送以下 REST 请求使用OpenID Connect以用户身份登录:

POST
http://{server}:{port}/auth/realms/{myRealm}/protocol/openid-connect/token

Body (x-www-form-urlencoded):
    client_id    {myClient}
    username     FooBar
    password     {userPassword}
    grant_type   password
Run Code Online (Sandbox Code Playgroud)

发送此请求会导致获取访问令牌刷新令牌

现在,我希望能够使用“当前活动的 Windows 会话”以某种方式登录(获取令牌或以其他方式验证用户),我的意思是当前登录到 Windows 的用户(存在于Active Directory LDAP中)应该无需提供任何凭据即可进行身份验证。

我的 Keycloak 领域中的用户联合已包含 AD LDAP 服务器的配置,因此所有用户现在也可在 Keycloak 中使用。

我浏览了 Keycloak 文档(特别是有关LDAP 和 Active Directory以及Kerberos 的部分),但不太明白到底需要做什么才能使其工作。

我也在这里搜索过,但我发现的唯一相关的事情是其他一些用户提到这应该是可能的

有人能指出我正确的方向吗?

c# ldap active-directory openid-connect keycloak

12
推荐指数
1
解决办法
2万
查看次数

Keycloak 无效的令牌发行者

我有一个移动应用程序(react-native)、一个资源服务(spring boot)和 Keycloak Authenticatioin Service(Auth-Service)。

客户端直接使用 Auth-Service 进行身份验证并获取访问令牌。当我向资源服务发出请求时,资源服务通过询问 Auth-Service 来检查访问令牌。但是客户端应用程序和 iss 字段获取的令牌是http://10.0.2.2:8060/auth/realms/sau和我在http://localhost:8110 的资源服务。

Keycloak 说: error="invalid_token", error_description="Invalid token issuer. Expected 'http://localhost:8060/auth/realms/sau', but was 'http://10.0.2.2:8060/auth/realms/sau'"

我的问题是如何代表我的客户在资源服务中进行身份验证?

移动应用:

 export const prepareRequestBody = credentials => {
  const params = new URLSearchParams();
  params.append('username', credentials.username);
  params.append('password', credentials.password);
  params.append('client_id', "nasilim-mobile-app");
  params.append('grant_type', "password");
  return params;
};

export const login = credentials => {
  const params = prepareRequestBody(credentials);
  return axios.post(LOGIN, params);
};
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

资源服务:

应用程序.yml

keycloak:
  realm: sau
  resource: photo-service
  bearer-only: false
  auth-server-url: http://localhost:8060/auth
  credentials: …
Run Code Online (Sandbox Code Playgroud)

oauth-2.0 openid-connect keycloak keycloak-services keycloak-rest-api

12
推荐指数
2
解决办法
9182
查看次数

从 Keycloak 导出用户和角色

我在 Keycloak 中创建了要导出的用户和角色。

当我尝试使用 UI 中领域的“导出”按钮导出它们时,我下载了一个 JSON 文件。

在此输入图像描述

但我在导出的文件中找不到任何用户或角色realm.json

如何从 Keycloak 导出包含用户和角色的领域 JSON?

export keycloak

12
推荐指数
2
解决办法
2万
查看次数

在docker容器内运行时如何保存keycloak数据?

我使用docker命令独立运行 keycloak docker run -p 8080:8080 -e KEYCLOAK_USER=admin -e KEYCLOAK_PASSWORD=admin quay.io/keycloak/keycloak:15.0.2

容器停止后如何挂载卷来保存数据?

mount docker keycloak podman

12
推荐指数
2
解决办法
9198
查看次数

微服务到微服务呼叫,来自队列消息的授权

背景:我正在创建一个支持SSO的多个应用程序的云平台.我正在使用Keycloak进行身份验证,使用Netflix Zuul通过Keycloak Spring Security Adapter 进行授权(API Gateway).

每个微服务都需要一个Authorization标头,其中包含一个有效的JWT,它将从中获取用户名(sub)来处理请求.每个微服务到微服务调用应首先通过Netflix Zuul,传递Authorization标头以维持无状态验证.该策略允许每个微服务器知道谁是间接调用微服务的用户(子).

问题/问题1:如果从队列消息中调用微服务会发生什么?我的一个想法是在队列中存储与消息+ userInfo相关的信息,并创建一个专用的微服务来处理这种消息,这种特殊的微服务应该从队列中读取userInfo并处理消息.

更新1:根据另一个论坛的电子邮件回复,将JWT存储在队列中并不是一个好主意,因为它可以轻松挖掘.

问题/问题2:但是,如果之前的特殊微服务想要调用另一个期望在头中接收JWT的普通微服务会发生什么?这个特殊的微服务是否应该由他自己创建一个JWT模仿用户并能够调用常规的微服务?

我认为另一种解决方案是将原始JWT存储在队列中,但是,如果队列稍后调用特殊微服务会发生什么?就在JWT不再有效(它已过期)之后,被调用的微服务将拒绝该请求?

可能的解决方案:(根据JoãoAngelo的讨论更新,见下文)

我应该验证来自我的用户(授权代码流)和我的服务(客户端凭证授权)的请求,这两个请求都应该包含有效负载中的用户信息.当请求来自用户时,我需要验证有效负载用户信息是否与JWT声明匹配.当请求来自服务时,我只需要信任该服务(只要它在我的控制之下).

我非常感谢你的帮助.谢谢.

spring-security jwt microservices keycloak netflix-zuul

11
推荐指数
1
解决办法
1792
查看次数

KEYCLOAK - 刷新/更新令牌不起作用

我有单页应用程序,该应用程序使用Angularjs并集成Keycloak用于身份验证和授权

我能够登录我的应用程序,获得登录的用户角色等。刷新令牌调用的那一刻,它总是在我的其他情况下返回,并且用户注销应用程序。虽然令牌有效时间设置得非常高。

如果用户打开了应用程序,我需要更新令牌。如果失败或令牌过期,我需要注销用户。if (refreshed)总是返回假。

下面是我正在使用的一段代码。

var __env = {};

        Object.assign(__env, window.__env);

        var keycloakConfig = {
            "url" : __env.keycloakUrl,
            "realm" : __env.keycloakRealm,
            "clientId" : __env.keycloakClientId,
            "credentials" : {
            "secret" : __env.keycloakSecret
            }
        };
var keycloak = Keycloak(keycloakConfig);
        keycloak.init({
            onLoad : 'login-required'
        }).success(function(authenticated) {
                 if(authenticated){                  
                        keycloak.loadUserInfo().success(function(userInfo) {
                        bootstrapAngular(keycloak, userInfo, roles);
                    });
            }
        });

function bootstrapAngular(keycloak, userInfo, roles) {
        angular.module('myApp').run(
                function($rootScope, $http, $interval, $cookies) {
                    var updateTokenInterval = $interval(function() {
                        // refresh token if it's …
Run Code Online (Sandbox Code Playgroud)

authentication token angularjs keycloak

11
推荐指数
2
解决办法
3万
查看次数

没找到publicKey for kid,Keycloak?

我在调用端点从angular js 2到widlfly服务器时遇到了这个异常"没有找到publicKey for kid".

验证发生在keycloak中,但是我使用相同的令牌在同一个域内调用来自不同客户端(不同的微服务)的8个端点,但是我只在这个微服务调用中得到了这个例外.

我确信用户拥有所有客户的所有角色.我还在JWT上解码了令牌来验证.

有时它工作,有时没有!这个异常堆栈跟踪:

Caused by: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:90)
    at sun.security.validator.Validator.getInstance(Validator.java:179)
    at sun.security.ssl.X509TrustManagerImpl.getValidator(X509TrustManagerImpl.java:312)
    at sun.security.ssl.X509TrustManagerImpl.checkTrustedInit(X509TrustManagerImpl.java:171)
    at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:184)
    at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:124)
    at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1491)
    at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:216)
    at sun.security.ssl.Handshaker.processLoop(Handshaker.java:979)
    at sun.security.ssl.Handshaker.process_record(Handshaker.java:914)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1062)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1375)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1403)
    ... 55 more
Caused by: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty
    at java.security.cert.PKIXParameters.setTrustAnchors(PKIXParameters.java:200)
    at java.security.cert.PKIXParameters.<init>(PKIXParameters.java:120)
    at java.security.cert.PKIXBuilderParameters.<init>(PKIXBuilderParameters.java:104)
    at sun.security.validator.PKIXValidator.<init>(PKIXValidator.java:88)
    ... 67 more

2017-06-09 00:33:35,994 ERROR [org.keycloak.adapters.rotation.AdapterRSATokenVerifier] (default task-445) Didn't find publicKey for kid: …
Run Code Online (Sandbox Code Playgroud)

java authentication jwt keycloak keycloak-services

11
推荐指数
2
解决办法
9816
查看次数