commit
1b3f98db1e
4 changed files with 38 additions and 5 deletions
|
@ -167,8 +167,7 @@
|
||||||
"clientId": "admin-client",
|
"clientId": "admin-client",
|
||||||
"enabled": true,
|
"enabled": true,
|
||||||
"publicClient": true,
|
"publicClient": true,
|
||||||
"directGrantsOnly": true,
|
"directGrantsOnly": true
|
||||||
"consentRequired": true
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"clientId": "product-sa-client",
|
"clientId": "product-sa-client",
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
<button onclick="refreshToken(9999)">Refresh Token</button>
|
<button onclick="refreshToken(9999)">Refresh Token</button>
|
||||||
<button onclick="refreshToken(30)">Refresh Token (if <30s validity)</button>
|
<button onclick="refreshToken(30)">Refresh Token (if <30s validity)</button>
|
||||||
<button onclick="loadProfile()">Get Profile</button>
|
<button onclick="loadProfile()">Get Profile</button>
|
||||||
|
<button onclick="loadUserInfo()">Get User Info</button>
|
||||||
<button onclick="output(keycloak.tokenParsed)">Show Token</button>
|
<button onclick="output(keycloak.tokenParsed)">Show Token</button>
|
||||||
<button onclick="output(keycloak.refreshTokenParsed)">Show Refresh Token</button>
|
<button onclick="output(keycloak.refreshTokenParsed)">Show Refresh Token</button>
|
||||||
<button onclick="output(keycloak.idTokenParsed)">Show ID Token</button>
|
<button onclick="output(keycloak.idTokenParsed)">Show ID Token</button>
|
||||||
|
@ -35,6 +36,14 @@
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function loadUserInfo() {
|
||||||
|
keycloak.loadUserInfo().success(function(userInfo) {
|
||||||
|
output(userInfo);
|
||||||
|
}).error(function() {
|
||||||
|
output('Failed to load user info');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
function refreshToken(minValidity) {
|
function refreshToken(minValidity) {
|
||||||
keycloak.updateToken(minValidity).success(function(refreshed) {
|
keycloak.updateToken(minValidity).success(function(refreshed) {
|
||||||
if (refreshed) {
|
if (refreshed) {
|
||||||
|
|
|
@ -36,6 +36,7 @@ import org.keycloak.protocol.oidc.TokenManager;
|
||||||
import org.keycloak.representations.AccessToken;
|
import org.keycloak.representations.AccessToken;
|
||||||
import org.keycloak.services.ErrorResponseException;
|
import org.keycloak.services.ErrorResponseException;
|
||||||
import org.keycloak.services.managers.AppAuthManager;
|
import org.keycloak.services.managers.AppAuthManager;
|
||||||
|
import org.keycloak.services.managers.AuthenticationManager;
|
||||||
import org.keycloak.services.resources.Cors;
|
import org.keycloak.services.resources.Cors;
|
||||||
import org.keycloak.services.Urls;
|
import org.keycloak.services.Urls;
|
||||||
|
|
||||||
|
@ -117,13 +118,17 @@ public class UserInfoEndpoint {
|
||||||
|
|
||||||
AccessToken token = null;
|
AccessToken token = null;
|
||||||
try {
|
try {
|
||||||
token = RSATokenVerifier.verifyToken(tokenString, realm.getPublicKey(), Urls.realmIssuer(uriInfo.getBaseUri(), realm.getName()));
|
token = RSATokenVerifier.verifyToken(tokenString, realm.getPublicKey(), Urls.realmIssuer(uriInfo.getBaseUri(), realm.getName()), true);
|
||||||
} catch (Exception e) {
|
} catch (Exception e) {
|
||||||
throw new ErrorResponseException(OAuthErrorException.INVALID_GRANT, "Token invalid", Status.FORBIDDEN);
|
throw new ErrorResponseException(OAuthErrorException.INVALID_GRANT, "Token invalid", Status.FORBIDDEN);
|
||||||
}
|
}
|
||||||
|
|
||||||
UserSessionModel userSession = session.sessions().getUserSession(realm, token.getSessionState());
|
UserSessionModel userSession = session.sessions().getUserSession(realm, token.getSessionState());
|
||||||
ClientSessionModel clientSession = session.sessions().getClientSession(token.getClientSession());
|
ClientSessionModel clientSession = session.sessions().getClientSession(token.getClientSession());
|
||||||
|
if (userSession == null || clientSession == null || !AuthenticationManager.isSessionValid(realm, userSession)) {
|
||||||
|
throw new ErrorResponseException(OAuthErrorException.INVALID_GRANT, "Token invalid", Status.FORBIDDEN);
|
||||||
|
}
|
||||||
|
|
||||||
ClientModel clientModel = realm.getClientByClientId(token.getIssuedFor());
|
ClientModel clientModel = realm.getClientByClientId(token.getIssuedFor());
|
||||||
UserModel userModel = userSession.getUser();
|
UserModel userModel = userSession.getUser();
|
||||||
AccessToken userInfo = new AccessToken();
|
AccessToken userInfo = new AccessToken();
|
||||||
|
|
|
@ -25,6 +25,7 @@ import org.junit.ClassRule;
|
||||||
import org.junit.Rule;
|
import org.junit.Rule;
|
||||||
import org.junit.Test;
|
import org.junit.Test;
|
||||||
import org.keycloak.OAuth2Constants;
|
import org.keycloak.OAuth2Constants;
|
||||||
|
import org.keycloak.models.KeycloakSession;
|
||||||
import org.keycloak.models.RealmModel;
|
import org.keycloak.models.RealmModel;
|
||||||
import org.keycloak.protocol.oidc.OIDCLoginProtocolService;
|
import org.keycloak.protocol.oidc.OIDCLoginProtocolService;
|
||||||
import org.keycloak.representations.AccessTokenResponse;
|
import org.keycloak.representations.AccessTokenResponse;
|
||||||
|
@ -54,8 +55,6 @@ import static org.junit.Assert.assertNotNull;
|
||||||
*/
|
*/
|
||||||
public class UserInfoTest {
|
public class UserInfoTest {
|
||||||
|
|
||||||
private static RealmModel realm;
|
|
||||||
|
|
||||||
@ClassRule
|
@ClassRule
|
||||||
public static KeycloakRule keycloakRule = new KeycloakRule();
|
public static KeycloakRule keycloakRule = new KeycloakRule();
|
||||||
|
|
||||||
|
@ -88,6 +87,27 @@ public class UserInfoTest {
|
||||||
client.close();
|
client.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void testSessionExpired() throws Exception {
|
||||||
|
Client client = ClientBuilder.newClient();
|
||||||
|
UriBuilder builder = UriBuilder.fromUri(org.keycloak.testsuite.Constants.AUTH_SERVER_ROOT);
|
||||||
|
URI grantUri = OIDCLoginProtocolService.tokenUrl(builder).build("test");
|
||||||
|
WebTarget grantTarget = client.target(grantUri);
|
||||||
|
AccessTokenResponse accessTokenResponse = executeGrantAccessTokenRequest(grantTarget);
|
||||||
|
|
||||||
|
KeycloakSession session = keycloakRule.startSession();
|
||||||
|
keycloakRule.startSession().sessions().removeUserSessions(session.realms().getRealm("test"));
|
||||||
|
keycloakRule.stopSession(session, true);
|
||||||
|
|
||||||
|
Response response = executeUserInfoRequest(accessTokenResponse.getToken());
|
||||||
|
|
||||||
|
assertEquals(Status.FORBIDDEN.getStatusCode(), response.getStatus());
|
||||||
|
|
||||||
|
response.close();
|
||||||
|
|
||||||
|
client.close();
|
||||||
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void testUnsuccessfulUserInfoRequest() throws Exception {
|
public void testUnsuccessfulUserInfoRequest() throws Exception {
|
||||||
Response response = executeUserInfoRequest("bad");
|
Response response = executeUserInfoRequest("bad");
|
||||||
|
|
Loading…
Reference in a new issue