Keycloak 和身份代理 (OpenId) IdentityBrokerException "Token no longer valid"
Keycloak and Identity Broker (OpenId) IdentityBrokerException "Token no longer valid"
我们已经在服务器上独立安装了 keycloak,并通过 wildfly 在同一台服务器上将其注册为适配器。因此,在 Identity Broker 使用 OpenId(自行编写并部署在其他域上)注册后,我们不会被重定向回我们的应用程序,但我们会收到下一个错误:"Failed to make identity provider oath callback: "Token is no longer valid”。
它接下来工作:
DNS:8080(8443)/app.war (server wildfly)-> (重定向到 keycloak on) DNS:8180(8543)/auth -> (选择 open-id 提供商后我们会成功重定向到它,我们将在输入名称和密码后登录系统)->(错误)我们没有被重定向到我们的应用程序,而是得到一个异常。
我们也尝试了 Google Auth 来测试服务器是否正常工作,是的,确实如此。而且我们的 Identity Broker 也可以与 localhost 一起正常工作。它可能是什么?
非常感谢任何帮助,并将为您提供您需要的任何代码片段。
Keycloak 1.9.4.Final,Wildfly 8.2.1.Final
代码:
wildfly, standalone-full.xml:
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<secure-deployment name="jbpm-console.war">
<realm>nameOfRealm</realm>
<resource>nameOfClient</resource>
<enable-basic-auth>true</enable-basic-auth>
<realm-public-key>myPublicKey</realm-public-key>
<auth-server-url>myUrl</auth-server-url>
<ssl-required>none</ssl-required>
<principal-attribute>preferred_username</principal-attribute>
<credential name="secret">mysecret</credential>
</secure-deployment>
</subsystem>
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
</interface>
</interfaces>
<subsystem xmlns="urn:jboss:domain:undertow:1.2">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
<single-sign-on path="/"/>
</host>
</server>
23:33:18,529 ERROR [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-5) Failed to make identity provider oauth callback: org.keycloak.broker.provider.IdentityBrokerException: Token is no longer valid
at org.keycloak.broker.oidc.OIDCIdentityProvider.validateToken(OIDCIdentityProvider.java:346)
at org.keycloak.broker.oidc.OIDCIdentityProvider.getFederatedIdentity(OIDCIdentityProvider.java:254)
at org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider$Endpoint.authResponse(AbstractOAuth2IdentityProvider.java:230)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
运行 与 Office 365 存在同样的问题,其中 Microsoft Azure AD 负责发出将由 Keycloak 验证和使用的令牌。
问题出在 Keycloak 服务器的时钟偏差上。这导致 Keycloak 拒绝 JSON Web 令牌,因为在实际情况并非如此时,令牌显然已过期。要解决此问题,必须同步托管 Keycloak 的服务器上的日期以减少或消除时钟偏差,以便 Keycloak 可以在令牌过期之前对其进行验证。
有一个现有的功能请求:https://issues.jboss.org/browse/KEYCLOAK-4538
我们遇到了同样的问题并修补了我们的服务器和客户端代码模块以支持时钟偏差功能。
在 keycloak-core 项目中修补 class JsonWebToken。用更新的模块替换了 JBoss / Wildfly 中的 keycloak-core 模块。下面记录了对 JsonWebToken 的更改
# Added these two fields to get clock skew from system property
public static final String KEYCLOAK_WEBTOKEN_CLOCK_SKEW_SEC = "Keycloak.WebToken.ClockSkew.Sec";
private static final Integer clockSkew = Integer.getInteger(KEYCLOAK_WEBTOKEN_CLOCK_SKEW_SEC, 0);
# Updated this method to support clock skew
@JsonIgnore
public boolean isNotBefore() {
int currentTime = Time.currentTime() + clockSkew;
int tokenTime = notBefore;
return currentTime >= tokenTime;
}
我们已经在服务器上独立安装了 keycloak,并通过 wildfly 在同一台服务器上将其注册为适配器。因此,在 Identity Broker 使用 OpenId(自行编写并部署在其他域上)注册后,我们不会被重定向回我们的应用程序,但我们会收到下一个错误:"Failed to make identity provider oath callback: "Token is no longer valid”。 它接下来工作: DNS:8080(8443)/app.war (server wildfly)-> (重定向到 keycloak on) DNS:8180(8543)/auth -> (选择 open-id 提供商后我们会成功重定向到它,我们将在输入名称和密码后登录系统)->(错误)我们没有被重定向到我们的应用程序,而是得到一个异常。
我们也尝试了 Google Auth 来测试服务器是否正常工作,是的,确实如此。而且我们的 Identity Broker 也可以与 localhost 一起正常工作。它可能是什么?
非常感谢任何帮助,并将为您提供您需要的任何代码片段。
Keycloak 1.9.4.Final,Wildfly 8.2.1.Final
代码:
wildfly, standalone-full.xml:
<subsystem xmlns="urn:jboss:domain:keycloak:1.1">
<secure-deployment name="jbpm-console.war">
<realm>nameOfRealm</realm>
<resource>nameOfClient</resource>
<enable-basic-auth>true</enable-basic-auth>
<realm-public-key>myPublicKey</realm-public-key>
<auth-server-url>myUrl</auth-server-url>
<ssl-required>none</ssl-required>
<principal-attribute>preferred_username</principal-attribute>
<credential name="secret">mysecret</credential>
</secure-deployment>
</subsystem>
<interfaces>
<interface name="management">
<inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
</interface>
<interface name="public">
<inet-address value="${jboss.bind.address:0.0.0.0}"/>
</interface>
<interface name="unsecure">
<inet-address value="${jboss.bind.address.unsecure:127.0.0.1}"/>
</interface>
</interfaces>
<subsystem xmlns="urn:jboss:domain:undertow:1.2">
<buffer-cache name="default"/>
<server name="default-server">
<http-listener name="default" socket-binding="http"/>
<host name="default-host" alias="localhost">
<location name="/" handler="welcome-content"/>
<filter-ref name="server-header"/>
<filter-ref name="x-powered-by-header"/>
<single-sign-on path="/"/>
</host>
</server>
23:33:18,529 ERROR [org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider] (default task-5) Failed to make identity provider oauth callback: org.keycloak.broker.provider.IdentityBrokerException: Token is no longer valid
at org.keycloak.broker.oidc.OIDCIdentityProvider.validateToken(OIDCIdentityProvider.java:346)
at org.keycloak.broker.oidc.OIDCIdentityProvider.getFederatedIdentity(OIDCIdentityProvider.java:254)
at org.keycloak.broker.oidc.AbstractOAuth2IdentityProvider$Endpoint.authResponse(AbstractOAuth2IdentityProvider.java:230)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
运行 与 Office 365 存在同样的问题,其中 Microsoft Azure AD 负责发出将由 Keycloak 验证和使用的令牌。
问题出在 Keycloak 服务器的时钟偏差上。这导致 Keycloak 拒绝 JSON Web 令牌,因为在实际情况并非如此时,令牌显然已过期。要解决此问题,必须同步托管 Keycloak 的服务器上的日期以减少或消除时钟偏差,以便 Keycloak 可以在令牌过期之前对其进行验证。
有一个现有的功能请求:https://issues.jboss.org/browse/KEYCLOAK-4538
我们遇到了同样的问题并修补了我们的服务器和客户端代码模块以支持时钟偏差功能。
在 keycloak-core 项目中修补 class JsonWebToken。用更新的模块替换了 JBoss / Wildfly 中的 keycloak-core 模块。下面记录了对 JsonWebToken 的更改
# Added these two fields to get clock skew from system property
public static final String KEYCLOAK_WEBTOKEN_CLOCK_SKEW_SEC = "Keycloak.WebToken.ClockSkew.Sec";
private static final Integer clockSkew = Integer.getInteger(KEYCLOAK_WEBTOKEN_CLOCK_SKEW_SEC, 0);
# Updated this method to support clock skew
@JsonIgnore
public boolean isNotBefore() {
int currentTime = Time.currentTime() + clockSkew;
int tokenTime = notBefore;
return currentTime >= tokenTime;
}