[keycloak-user] Identity provider, keycloak js adapter and session management
Peter Nalyvayko
petervn1 at yahoo.com
Thu Jul 13 08:29:56 EDT 2017
Thanks, Marek.
--------------------------------------------
On Wed, 7/12/17, Marek Posolda <mposolda at redhat.com> wrote:
Subject: Re: [keycloak-user] Identity provider, keycloak js adapter and session management
To: "Peter Nalyvayko" <petervn1 at yahoo.com>, keycloak-user at lists.jboss.org
Date: Wednesday, July 12, 2017, 7:17 AM
There was some
related fix in latest
master https://issues.jboss.org/browse/KEYCLOAK-5139
. However
your issue with iframe looks like something different.
Feel free
to create JIRA if it won't help.
Ideally you can also send PR. We have tests for
pairwise in OIDCPairwiseClientRegistrationTest.java
and there are some IFrame related tests in LoginStatusIframeEndpointTest
.
Marek
On 07/07/17 18:06, Peter Nalyvayko wrote:
Some additional info: we can also reproduce the
same behavior using the Pairwise subject identifier, i.e.
users keep getting logged out after 5 seconds.
--------------------------------------------
On Thu, 7/6/17, Peter Nalyvayko <petervn1 at yahoo.com>
wrote:
Subject: Identity provider, keycloak js adapter and session
management
To: keycloak-user at lists.jboss.org
Date: Thursday, July 6, 2017, 12:10 PM
Hi,
We've hit a bit of a snag while setting
up our one page js client. Changing the value of the
"sub"
claim to anything other than the unique identifier of the
keycloak user causes the keycloak adapter to detect the
changes to the session and clear out the tokens, forcing
the
users to re-log in after every 5 seconds.
We are using the version 2.3.0 of
keycloak. Our app is set up to use keycloak.js adapter for
all things related to OIDC. The adapter is configured to
use
the "code authorization" (standard) flow. The
instance of
keycloak is configured to use an external OIDC identity
provider and the users are uniquely identified by their
e-mails. Naturally, we wanted that the "sub"
claim in the
claim set returned by calling the keycloak's OIDC
/token
endpoint would return the unique identity of the external
user rather than the internal identifier of the keycloak
user, so we re-configured the keycloak client by adding a
property mapper to map the user's email to the
"sub" claim,
here the example of the access token:
{
"sub": "user at company.com",
"iat": 223235098325,
"email": "user at company.com",
...
}
Once we had implemented these changes
on the keycloak side, our users were able to initially sign
into the application, but when they tried to access any
functionality within the app, they would be prompted to
sign
in again. The problem seems to related to the OIDC session
management and the assumption and the "sub" claim
always
matches the keycloak user's unique identifier.
We narrowed the problem down to four
components:
- keycloak.js
- login-status-iframe.html
-
services\srv\main\java\org\keycloak\protocol\oidc\endpoints\LoginStatusIframeEndpoint.java
-
services\src\main\java\org\keycloak\services\managers\AuthenticationManager.java
In keycloak.js, line 637, the
implementation creates a session id to be used to check the
session state. Notice that the code uses the value from the
"sub" claim:
var sessionId = kc.realm + "/"
+ kc.tokenParsed.sub;
In
AuthenticationManager.createLoginCookie, line 306, the
value
of the "SESSION_COOKIE" is set to:
String sessionCookieValue =
realm.getName() + "/" + user.getId();
Sadly, in our configuration, the value
returned of by user.getId() is not the same as the value
stored in the "sub" claim, thus causing the
session
management code in login-status-iframe.html, line 53 to
clear out any tokens and force the users to re-login the
next time it checks the session state (default is 5 second
intervals):
var cookie = getCookie();
if (sessionState == cookie) {
... } else { callback("changed"); }
Looking at the
LoginStatusIframeEndpoint.preCheck
(LoginSatusIframeEndpoint.java, lines 71-93), we've
noticed
that the implementation does not even make use of the user
identity, only the session id.
The workaround, at least temporary, for
us was to add the "id" claim containing the user
identity
internal to keycloak, and modify the keycloak JS adapter
code to look for the "id" claim and use its value
instead of
the value in the "sub" claim when creating the
session id,
i.e.:
var sessionId;
if (kc.tokenParsed.id) {
sessionId =
kc.realm + "/" + kc.tokenParsed.id;
} else {
sessionId =
kc.realm + "/" + kc.tokenParsed.sub;
}
Is this a bug, or does it work as
intended, i.e. the users should never set the
"sub" claim to
anything other than the keycloak's user identity? If
this is
a bug, I can submit a JIRA request and a fix as long as the
workaround above seems like an acceptable solution
Any comments are welcome
Regards,
Peter
_______________________________________________
keycloak-user mailing list
keycloak-user at lists.jboss.org
https://lists.jboss.org/mailman/listinfo/keycloak-user
More information about the keycloak-user
mailing list