
我Keycloak (version 1.0.4.Final)在JBOSS AS 7.1.1服务器中使用.服务器位于Amazon AWS上.
我能用keycloak启动jboss服务器.我可以在点击URL时看到keycloak默认屏幕 - ServerIP:8080/auth
但是当我点击Administration Console链接进入登录界面时.我正在翻页说 - HTTPS required
服务器在AWS上,更改为"ssl-required" : "none",
General Adapter Config没有帮助.
如何解决这个问题?
编辑:我没有在keycloak-1.2.0.Beta1版本中遇到此问题.
我使用keycloak保证我的休息API,我跟着这个教程以编程方式添加用户,但我得到这个错误信息:
ERROR [io.undertow.request] (default task-9) UT005023: Exception handling request to /service/secured: org.jboss.resteasy.spi.UnhandledException: javax.ws.rs.client.ResponseProcessingException: javax.ws.rs.ProcessingException: com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "access_token" (class org.keycloak.representations.AccessTokenResponse), not marked as ignorable (9 known properties: "notBeforePolicy", "otherClaims", "tokenType", "token", "expiresIn", "sessionState", "refreshExpiresIn", "idToken", "refreshToken"])
at [Source: org.apache.http.conn.EofSensorInputStream@9d6aba2; line: 1, column: 18] (through reference chain: org.keycloak.representations.AccessTokenResponse["access_token"])
at org.jboss.resteasy.core.ExceptionHandler.handleApplicationException(ExceptionHandler.java:76)
at org.jboss.resteasy.core.ExceptionHandler.handleException(ExceptionHandler.java:212)
at org.jboss.resteasy.core.SynchronousDispatcher.writeException(SynchronousDispatcher.java:149)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:372)
at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
at io.undertow.servlet.handlers.ServletHandler.handleRequest(ServletHandler.java:86)
at io.undertow.servlet.handlers.security.ServletSecurityRoleHandler.handleRequest(ServletSecurityRoleHandler.java:62)
at io.undertow.servlet.handlers.ServletDispatchingHandler.handleRequest(ServletDispatchingHandler.java:36)
at org.wildfly.extension.undertow.security.SecurityContextAssociationHandler.handleRequest(SecurityContextAssociationHandler.java:78)
at io.undertow.server.handlers.PredicateHandler.handleRequest(PredicateHandler.java:43)
at org.keycloak.adapters.undertow.UndertowAuthenticatedActionsHandler.handleRequest(UndertowAuthenticatedActionsHandler.java:66)
at …Run Code Online (Sandbox Code Playgroud) 我正在尝试在根服务器上设置 Keycloak,但无法从 Internet 访问管理控制台。我已经安装了 keycloak 服务器并将它放在同一台机器上的 nginx 反向代理后面。我已经为域设置了一个 Letencrypt 证书。我还通过脚本为 keycloak 设置了管理员用户。
当我使用它的域访问服务器时,https://<my-domain>我被转发到https://<my-domain>/auth并且有一个带有“管理控制台”链接的 keycloak 欢迎页面。此链接指向https://<my-domain>/admin但显示 404。
起初我认为这可能是 nginx 的问题,所以我按照文档中的指南设置负载平衡器(https://www.keycloak.org/docs/latest/server_installation/index.html#_setting-up-负载平衡器或代理)。在那里,在“验证配置”下,它告诉您打开https://<my-domain>/auth/realms/master/.well-known/openid-configuration按预期工作的路径,然后我得到一个包含多个链接和其他信息的 json 文件。但是,这些链接都不起作用 - 都给了我 404。
当我尝试时,https://<my-domain>/auth/realms/master我得到一个 JSON 响应。所以有些链接确实有效,所以我认为这不是 nginx 的问题,而是 keycloak 本身的问题。
所以基本问题是:如何配置 Keycloak 以便我可以通过互联网访问管理控制台?我读过默认情况下您只能在本地主机上访问它,但必须有一种方法可以覆盖此默认值?
相关的 nginx 配置:
upstream keycloak {
server 127.0.0.1:8080;
}
server {
listen 443 ssl http2;
# some ssl configuration for letsencrypt
location / {
proxy_pass http://keycloak;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 Keycloak 服务器保护 Angular 应用程序的安全。我遵循了一些教程,它们或多或少提供了相同的说明,但我遇到了以下错误:
等待第 3 方检查 iframe 消息时超时。
我使用以下 docker-compose 配置启动 keycloak 服务器:
auth:
container_name: nerthus-tech-auth
image: quay.io/keycloak/keycloak:17.0.1
command: start-dev
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
KC_DB: postgres
KC_DB_URL: jdbc:postgresql://database:5432/keycloak
KC_DB_USERNAME: keycloak
KC_DB_PASSWORD: str0ngP@ssword
ports:
- 10010:8080
Run Code Online (Sandbox Code Playgroud)
我创建了一个领域(nerthus)和一个公共客户端(博客),并具有以下配置:
在 Angular 应用程序方面,我安装了 keycloak-angular 和 keycloak-js 依赖项:
"keycloak-angular": "^9.1.0",
"keycloak-js": "^16.1.1"
Run Code Online (Sandbox Code Playgroud)
我还为 Keycloak 注册了一个初始化程序:
providers: [
{
provide: APP_INITIALIZER,
useFactory: initializeKeycloak,
multi: true,
deps: [KeycloakService]
}
]
Run Code Online (Sandbox Code Playgroud)
function initializeKeycloak(keycloakService: KeycloakService) {
return () => …Run Code Online (Sandbox Code Playgroud) 我需要帮助在Errai应用程序中使用keycloak.我收到关于"KEYCLOAK"的"未知身份验证方法"的错误?我有运行的keycloak设备(虽然在不同的端口上),并且Errai应用程序在WEB-INF内的web.xml文件中有一个KEYCLOAK当我用mvn gwt:run运行Errai应用程序时,我得到:RuntimeException导致通过"未知的身份验证机制KEYCLOAK".我不知道如何解决这个问题.
我正在运行一个脚本,在请求域的用户列表之前请求主令牌.我在紧密循环中执行此请求100次,并输出执行"auth/admin/realms/mine/users?first=0&max=1000"请求所需的时间.
使用本地安装的keycloak docker进行测试时,单个请求需要4.0秒.如果我同时运行此脚本的5个实例,则单个请求大约需要10秒.如果我运行10个实例,它会在收到回复之前跳转到20秒.
因此,我在页面上的webapp中遇到了严重的瓶颈,我列出了所有用户信息,并想知道如何解决这个问题.
我运行keycloak 2.5.0.Final.我的家是/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.111-2.b15.el7_3.x86_64/jre.authorizationPersister = jpa.
我的剧本:
import requests
keyCloakUrl = "http://foo.bar"
for i in range(100):
session = requests.Session()
r = session.post(
keyCloakUrl +"auth/realms/master/protocol/openid-connect/token",
data={
"grant_type":"password",
"client_id":"admin-cli",
"username":"admin",
"password":"admin"
}
)
master_token = json.loads(r.content)['access_token']
r = s.get(
keyCloakUrl + "auth/admin/realms/mine/users?first=0&max=1000",
headers={'Authorization':'Bearer '+master_token}
)
print(r.elapsed.total_seconds())
Run Code Online (Sandbox Code Playgroud)
我的dockerfile:
FROM jboss/keycloak-mysql:2.5.0.Final
ARG db2
ADD deps/ /opt/jboss/keycloak/
RUN /opt/jboss/keycloak/import_utbud_realm.sh
CMD ["-b", "0.0.0.0", "-bmanagement", "0.0.0.0", "-Djboss.socket.binding.port-offset=2"]
Run Code Online (Sandbox Code Playgroud)
UPDATE
我还尝试测量"auth/realms/master/protocol/openid-connect/token"请求的时间.这是每个请求0.1秒,只有一个脚本运行实例,0.8秒运行10个实例.
我在本地计算机上运行了独立的keycloak。
我创建了一个名为“ spring-test”的新领域,然后创建了一个名为“ login-app”的新客户端
根据其余文档:
POST: http://localhost:8080/auth/realms/spring-test/protocol/openid-connect/token
{
"client_id": "login-app",
"username": "user123",
"password": "pass123",
"grant_type": "password"
}
Run Code Online (Sandbox Code Playgroud)
应该给我jwt令牌,但是我收到了错误的请求并做出了回应
{
"error": "invalid_request",
"error_description": "Missing form parameter: grant_type"
}
Run Code Online (Sandbox Code Playgroud)
我假设我的配置中缺少某些内容。
编辑:我正在使用json正文,但它应该是形式url编码:以下正文有效:
token_type_hint:access_token&token:{token}&client_id:{client_id}&client_secret:{client_secret}
Run Code Online (Sandbox Code Playgroud) 我意识到这个问题有很多迭代。但我似乎无法正确理解答案。
我们已经使用类似于这篇文章的 oauth2 spring 服务器保护了我们的 rabbitmq 和 rest 端点。但它没有我们需要和想要的所有功能。所以我们想使用 Keycloak。通过转到新版本的 spring security 5.1 并指定 security.oauth2.resource.jwk.key-set-uri 并设置必要的依赖项和配置,我已经成功地保护了其余端点。
在尝试保护 RabbitMQ 时,我在检查消息头中的承载令牌时遇到了问题,因为 keycloak jwks 端点没有返回真正的 RSA 公钥。
RabbitMQ 使用CustomMessageListenerContainer从消息头中获取令牌,并使用 DefaultTokenServices 来检查令牌。
根据我的理解,使用密钥响应的端点是https://keycloak-server/auth/realms/my-realm/protocol/openid-connect/certs 在这个端点上执行 HttpGet,我得到的响应看起来像下列的
{
"keys": [{
"kid": "7JUbcl_96GNk2zNh4MAORuEz3YBuprXilmTXjm0gmRE",
"kty": "RSA",
"alg": "RS256",
"use": "sig",
"n": "nE9gEtzZvV_XisnAY8Hung399hwBM_eykZ9J57euboEsKra8JvDmE6w7SSrk-aTVjdNpjdzOyrFd4V7tFqev1vVJu8MJGIyQlbPv07MTsgYE5EPM4DxdQ7H6_f3vQjq0hznkFvC-hyCqUhxPTXM5NgvH86OekL2C170xnd50RLWw8FbrprP2oRjgBnXMAif1Dd8kwbKKgf5m3Ou0yTVGfsCRG1_LSj6gIEFglxNHvGz0RejoQql0rGMxcW3MzCvc-inF3FCafQTrG5eWHqp5xXEeMHz0JosQ7BcT8MVp9lHT_utiazhQ1uKZEb4uoYOyy6mDDkx-wExpZkOx76bk_Yu-N25ljY18hNllnV_8gVMkX46_vcc-eN3DRZGNJ-Asd_sZrjbXbAvBbKwVxZeOTaXiUdvl8O0G5xX2xPnS_WA_1U4b_V1t28WtnX4bqGlOejW2kkjLvNrpfQ5fnvLjkl9I2B16Mbh9nS0LJD0RR-AkBsv3rKEnMyEkW9UsfgYKLFKuH32x_CXi9uyvNDas_q8WS3QvYwAGEMRO_4uICDAqupCVb1Jcs9dvd1w-tUfj5MQOXB-srnQYf5DbFENTNM1PK390dIjdLJh4k2efCJ21I1kYw2Qr9lHI4X2peTinViaoOykykJiol6LMujUcfqaZ1qPKDy_UnpAwGg9NyFU",
"e": "AQAB"
}
]
}
Run Code Online (Sandbox Code Playgroud)
根据我的理解,密钥为“n”的字段应该是 RSA256 密钥。将它添加到 RSAVerifier 最终会得到一个错误:“Caused by: org.springframework.security.jwt.codec.InvalidBase64CharacterException: Bad Base64 input character decimal 95 in array position 2.”
但是,如果我登录到 keycloak 管理页面并进入领域设置-> 键并单击公钥,则弹出窗口会显示公钥减去“-----BEGIN PUBLIC KEY-----”和“- ----END PUBLIC KEY-----”页眉和页脚。硬编码这使一切正常。 …
我试图确定为 .Net Core 3.0 提供的 JwtBearer 服务是否实际上使用了我的 oidc 提供商众所周知的配置提供的非对称签名密钥?
我找不到与此相关的任何文档。
.AddJwtBearer(opt =>
{
opt.Authority = "http://localhost:8180/auth/realms/master";
opt.TokenValidationParameters = new Microsoft.IdentityModel.Tokens.TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = false,
ValidateLifetime = true,
ValidateIssuerSigningKey = true
};
Run Code Online (Sandbox Code Playgroud)
我使用 Keycloak 4.8.3 作为我的 oidc 提供程序。我能找到的最接近的文档在这里。https://developer.okta.com/blog/2018/03/23/token-authentication-aspnetcore-complete-guide
相关部分在这里:
如果您让 JwtBearer 中间件通过发现文档自动配置,这一切都会自动运行!
上面的代码完成了所有这些吗?由于我们不再注册中间件,这在 3.0 中仍然相关吗?
我敢打赌很多人不了解非对称签名密钥,也不知道它们为何如此重要。我们已经从开发人员那里抽象了太多东西,现在我什至不知道我的 api 是否安全。
所以最后的问题是:
具有“ValidateIssuerSigningKey”的 .AddJwtBearer 服务是否定期检查众所周知的或任何发现文档以获取最新的非对称签名密钥?
我无法将任何领域导入 Keycloak 18.0.0。那是 Quarkus,不再是 Wildfly 发行版。这里的文档说它应该非常简单,通过将我导出的realm.json文件安装到/opt/keycloak/data/import/...json中,它实际上尝试导入它,但它以以下内容结尾:
"[org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: Script upload is disabled"。
已知已被删除,旧的-Dkeycloak.profile.feature.upload_scripts=enabled将不再起作用。好的。但是在启动时导入任何领域的方法是什么?这将用于分发现成的本地堆栈,无需任何手工制作即可启动。我可以通过运行 SQL 命令来做到这一点,但这对我来说太老套了。
撰写文件:
cp-keycloak:
image: quay.io/keycloak/keycloak:18.0.0
environment:
KC_DB: mysql
KC_DB_URL: jdbc:mysql://cp-keycloak-database:3306/keycloak
KC_DB_USERNAME: root
KC_DB_PASSWORD: root
KC_HOSTNAME: localhost
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
ports:
- 8082:8080
volumes:
- ./data/local_stack/init.keycloak.json:/opt/keycloak/data/import/main-realm.json:ro
entrypoint: "/opt/keycloak/bin/kc.sh start-dev --import-realm"
Run Code Online (Sandbox Code Playgroud)
输出 :
cp-keycloak_1 | 2022-05-05 14:07:26,801 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: Failed to start server in (development) mode
cp-keycloak_1 | 2022-05-05 14:07:26,802 ERROR [org.keycloak.quarkus.runtime.cli.ExecutionExceptionHandler] (main) ERROR: Failed to import realm: Main-Realm …Run Code Online (Sandbox Code Playgroud)