Search in sources :

Example 1 with SessionRepresentation

use of org.keycloak.representations.account.SessionRepresentation in project keycloak by keycloak.

the class SessionResource method createSessionRepresentation.

private SessionRepresentation createSessionRepresentation(UserSessionModel s, DeviceRepresentation device) {
    SessionRepresentation sessionRep = new SessionRepresentation();
    sessionRep.setId(s.getId());
    sessionRep.setIpAddress(s.getIpAddress());
    sessionRep.setStarted(s.getStarted());
    sessionRep.setLastAccess(s.getLastSessionRefresh());
    sessionRep.setExpires(s.getStarted() + realm.getSsoSessionMaxLifespan());
    sessionRep.setBrowser(device.getBrowser());
    if (isCurrentSession(s)) {
        sessionRep.setCurrent(true);
    }
    sessionRep.setClients(new LinkedList());
    for (String clientUUID : s.getAuthenticatedClientSessions().keySet()) {
        ClientModel client = realm.getClientById(clientUUID);
        ClientRepresentation clientRep = new ClientRepresentation();
        clientRep.setClientId(client.getClientId());
        clientRep.setClientName(client.getName());
        sessionRep.getClients().add(clientRep);
    }
    return sessionRep;
}
Also used : ClientModel(org.keycloak.models.ClientModel) SessionRepresentation(org.keycloak.representations.account.SessionRepresentation) LinkedList(java.util.LinkedList) ClientRepresentation(org.keycloak.representations.account.ClientRepresentation)

Example 2 with SessionRepresentation

use of org.keycloak.representations.account.SessionRepresentation in project keycloak by keycloak.

the class SessionRestServiceTest method testGetDevicesSessions.

@Test
public void testGetDevicesSessions() throws Exception {
    ContainerAssume.assumeAuthServerUndertow();
    assumeTrue("Browser must be htmlunit. Otherwise we are not able to set desired BrowserHeaders", System.getProperty("browser").equals("htmlUnit"));
    WebDriver firstBrowser = oauth.getDriver();
    // first browser authenticates from Fedora
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1");
    codeGrant("public-client-0");
    List<DeviceRepresentation> devices = getDevicesOtherThanOther();
    assertEquals("Should have a single device", 1, devices.size());
    List<DeviceRepresentation> fedoraDevices = devices.stream().filter(deviceRepresentation -> "Fedora".equals(deviceRepresentation.getOs())).collect(Collectors.toList());
    assertEquals("Should have a single Fedora device", 1, fedoraDevices.size());
    fedoraDevices.stream().forEach(device -> {
        List<SessionRepresentation> sessions = device.getSessions();
        assertEquals(1, sessions.size());
        assertThat(sessions, Matchers.hasItem(Matchers.hasProperty("browser", Matchers.is("Firefox/15.0.1"))));
    });
    // second browser authenticates from Windows
    oauth.setDriver(secondBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Gecko/20100101 Firefox/15.0.1");
    codeGrant("public-client-0");
    devices = getDevicesOtherThanOther();
    // should have two devices
    assertEquals("Should have two devices", 2, devices.size());
    fedoraDevices = devices.stream().filter(deviceRepresentation -> "Fedora".equals(deviceRepresentation.getOs())).collect(Collectors.toList());
    assertEquals(1, fedoraDevices.size());
    List<DeviceRepresentation> windowsDevices = devices.stream().filter(deviceRepresentation -> "Windows".equals(deviceRepresentation.getOs())).collect(Collectors.toList());
    assertEquals(1, windowsDevices.size());
    windowsDevices.stream().forEach(device -> {
        List<SessionRepresentation> sessions = device.getSessions();
        assertEquals(1, sessions.size());
        assertThat(sessions, Matchers.hasItem(Matchers.hasProperty("browser", Matchers.is("Firefox/15.0.1"))));
    });
    // first browser authenticates from Windows using Edge
    oauth.setDriver(firstBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (Windows Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36 Edge/12.0");
    codeGrant("public-client-0");
    // second browser authenticates from Windows using Firefox
    oauth.setDriver(secondBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Gecko/20100101 Firefox/15.0.1");
    codeGrant("public-client-0");
    // third browser authenticates from Windows using Safari
    oauth.setDriver(thirdBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Version/11.0 Safari/603.1.30");
    oauth.setBrowserHeader("X-Forwarded-For", "192.168.10.3");
    OAuthClient.AccessTokenResponse tokenResponse = codeGrant("public-client-0");
    devices = getDevicesOtherThanOther(tokenResponse.getAccessToken());
    assertEquals("Should have a single device because all browsers (and sessions) are from the same platform (OS + OS version)", 1, devices.size());
    windowsDevices = devices.stream().filter(device -> "Windows".equals(device.getOs())).collect(Collectors.toList());
    assertEquals(1, windowsDevices.size());
    windowsDevices.stream().forEach(device -> {
        List<SessionRepresentation> sessions = device.getSessions();
        assertEquals(3, sessions.size());
        assertEquals(1, sessions.stream().filter(rep -> rep.getIpAddress().equals("127.0.0.1") && rep.getBrowser().equals("Firefox/15.0.1") && rep.getCurrent() == null).count());
        assertEquals(1, sessions.stream().filter(rep -> rep.getIpAddress().equals("127.0.0.1") && rep.getBrowser().equals("Edge/12.0") && rep.getCurrent() == null).count());
        assertEquals(1, sessions.stream().filter(rep -> rep.getIpAddress().equals("192.168.10.3") && rep.getBrowser().equals("Safari/11.0") && rep.getCurrent()).count());
    });
    // third browser authenticates from Windows using a different Windows version
    oauth.setDriver(thirdBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (Windows 7) AppleWebKit/537.36 (KHTML, like Gecko) Version/11.0 Safari/603.1.30");
    oauth.setBrowserHeader("X-Forwarded-For", "192.168.10.3");
    codeGrant("public-client-0");
    devices = getDevicesOtherThanOther();
    windowsDevices = devices.stream().filter(device -> "Windows".equals(device.getOs())).collect(Collectors.toList());
    assertEquals("Should have two devices for two distinct Windows versions", 2, devices.size());
    assertEquals(2, windowsDevices.size());
    oauth.setDriver(firstBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (iPhone; CPU iPhone OS 5_1_1 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9B206 Safari/7534.48.3");
    codeGrant("public-client-0");
    oauth.setDriver(secondBrowser);
    oauth.setBrowserHeader("User-Agent", "Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:15.0) Gecko/20100101 Firefox/15.0.1");
    codeGrant("public-client-0");
    devices = getDevicesOtherThanOther();
    assertEquals("Should have 3 devices", 3, devices.size());
    windowsDevices = devices.stream().filter(device -> "Windows".equals(device.getOs())).collect(Collectors.toList());
    assertEquals(1, windowsDevices.size());
    fedoraDevices = devices.stream().filter(deviceRepresentation -> "Fedora".equals(deviceRepresentation.getOs())).collect(Collectors.toList());
    assertEquals(1, fedoraDevices.size());
    List<DeviceRepresentation> iphoneDevices = devices.stream().filter(device -> "iOS".equals(device.getOs()) && "iPhone".equals(device.getDevice())).collect(Collectors.toList());
    assertEquals(1, iphoneDevices.size());
    iphoneDevices.stream().forEach(device -> {
        assertTrue(device.isMobile());
        List<SessionRepresentation> sessions = device.getSessions();
        assertEquals(1, sessions.size());
        assertEquals(1, sessions.stream().filter(rep -> rep.getBrowser().equals("Mobile Safari/5.1")).count());
    });
}
Also used : WebDriver(org.openqa.selenium.WebDriver) ThirdBrowser(org.keycloak.testsuite.util.ThirdBrowser) AuthServerContainerExclude(org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude) SecondBrowser(org.keycloak.testsuite.util.SecondBrowser) WebDriver(org.openqa.selenium.WebDriver) DeviceRepresentation(org.keycloak.representations.account.DeviceRepresentation) ContainerAssume(org.keycloak.testsuite.util.ContainerAssume) Assert.assertThat(org.junit.Assert.assertThat) OAuthClient(org.keycloak.testsuite.util.OAuthClient) SimpleHttp(org.keycloak.broker.provider.util.SimpleHttp) Drone(org.jboss.arquillian.drone.api.annotation.Drone) TypeReference(com.fasterxml.jackson.core.type.TypeReference) AuthServer(org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude.AuthServer) SessionRepresentation(org.keycloak.representations.account.SessionRepresentation) TokenUtil(org.keycloak.testsuite.util.TokenUtil) Assert.assertNotNull(org.junit.Assert.assertNotNull) Assert.assertTrue(org.junit.Assert.assertTrue) Matchers(org.hamcrest.Matchers) IOException(java.io.IOException) Test(org.junit.Test) Collectors(java.util.stream.Collectors) RealmRepresentation(org.keycloak.representations.idm.RealmRepresentation) List(java.util.List) Matchers.equalTo(org.hamcrest.Matchers.equalTo) ClientRepresentation(org.keycloak.representations.account.ClientRepresentation) ClientBuilder(org.keycloak.testsuite.util.ClientBuilder) Assume.assumeTrue(org.junit.Assume.assumeTrue) Matchers.anyOf(org.hamcrest.Matchers.anyOf) Assert.assertEquals(org.junit.Assert.assertEquals) OAuth2Constants(org.keycloak.OAuth2Constants) DeviceRepresentation(org.keycloak.representations.account.DeviceRepresentation) OAuthClient(org.keycloak.testsuite.util.OAuthClient) SessionRepresentation(org.keycloak.representations.account.SessionRepresentation) Test(org.junit.Test)

Example 3 with SessionRepresentation

use of org.keycloak.representations.account.SessionRepresentation in project keycloak by keycloak.

the class SessionRestServiceTest method testGetSessions.

@Test
@AuthServerContainerExclude(AuthServer.REMOTE)
public void testGetSessions() throws Exception {
    oauth.setDriver(secondBrowser);
    codeGrant("public-client-0");
    List<SessionRepresentation> sessions = getSessions();
    assertEquals(2, sessions.size());
    for (SessionRepresentation session : sessions) {
        assertNotNull(session.getId());
        assertThat(session.getIpAddress(), anyOf(equalTo("127.0.0.1"), equalTo("0:0:0:0:0:0:0:1")));
        assertTrue(session.getLastAccess() > 0);
        assertTrue(session.getExpires() > 0);
        assertTrue(session.getStarted() > 0);
        assertThat(session.getClients(), Matchers.hasItem(Matchers.hasProperty("clientId", anyOf(Matchers.is("direct-grant"), Matchers.is("public-client-0")))));
    }
}
Also used : SessionRepresentation(org.keycloak.representations.account.SessionRepresentation) AuthServerContainerExclude(org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude) Test(org.junit.Test)

Example 4 with SessionRepresentation

use of org.keycloak.representations.account.SessionRepresentation in project keycloak by keycloak.

the class SessionRestServiceTest method testLogout.

@Test
public void testLogout() throws IOException {
    TokenUtil viewToken = new TokenUtil("view-account-access", "password");
    String sessionId = oauth.doLogin("view-account-access", "password").getSessionState();
    List<SessionRepresentation> sessions = getSessions(viewToken.getToken());
    assertEquals(2, sessions.size());
    // With `ViewToken` you can only read
    int status = SimpleHttp.doDelete(getAccountUrl("sessions/" + sessionId), httpClient).acceptJson().auth(viewToken.getToken()).asStatus();
    assertEquals(403, status);
    sessions = getSessions(viewToken.getToken());
    assertEquals(2, sessions.size());
    // Here you can delete the session
    status = SimpleHttp.doDelete(getAccountUrl("sessions/" + sessionId), httpClient).acceptJson().auth(tokenUtil.getToken()).asStatus();
    assertEquals(204, status);
    sessions = getSessions(tokenUtil.getToken());
    assertEquals(1, sessions.size());
}
Also used : TokenUtil(org.keycloak.testsuite.util.TokenUtil) SessionRepresentation(org.keycloak.representations.account.SessionRepresentation) Test(org.junit.Test)

Example 5 with SessionRepresentation

use of org.keycloak.representations.account.SessionRepresentation in project keycloak by keycloak.

the class AccountRestServiceTest method testDeleteSessions.

public void testDeleteSessions() throws IOException {
    TokenUtil viewToken = new TokenUtil("view-account-access", "password");
    oauth.doLogin("view-account-access", "password");
    List<SessionRepresentation> sessions = SimpleHttp.doGet(getAccountUrl("sessions"), httpClient).auth(viewToken.getToken()).asJson(new TypeReference<List<SessionRepresentation>>() {
    });
    assertEquals(2, sessions.size());
    int status = SimpleHttp.doDelete(getAccountUrl("sessions?current=false"), httpClient).acceptJson().auth(viewToken.getToken()).asStatus();
    assertEquals(200, status);
    sessions = SimpleHttp.doGet(getAccountUrl("sessions"), httpClient).auth(viewToken.getToken()).asJson(new TypeReference<List<SessionRepresentation>>() {
    });
    assertEquals(1, sessions.size());
}
Also used : TokenUtil(org.keycloak.testsuite.util.TokenUtil) List(java.util.List) TypeReference(com.fasterxml.jackson.core.type.TypeReference) SessionRepresentation(org.keycloak.representations.account.SessionRepresentation)

Aggregations

SessionRepresentation (org.keycloak.representations.account.SessionRepresentation)7 Test (org.junit.Test)5 AuthServerContainerExclude (org.keycloak.testsuite.arquillian.annotation.AuthServerContainerExclude)4 ClientRepresentation (org.keycloak.representations.account.ClientRepresentation)3 DeviceRepresentation (org.keycloak.representations.account.DeviceRepresentation)3 OAuthClient (org.keycloak.testsuite.util.OAuthClient)3 TokenUtil (org.keycloak.testsuite.util.TokenUtil)3 TypeReference (com.fasterxml.jackson.core.type.TypeReference)2 List (java.util.List)2 IOException (java.io.IOException)1 LinkedList (java.util.LinkedList)1 Collectors (java.util.stream.Collectors)1 Matchers (org.hamcrest.Matchers)1 Matchers.anyOf (org.hamcrest.Matchers.anyOf)1 Matchers.equalTo (org.hamcrest.Matchers.equalTo)1 Drone (org.jboss.arquillian.drone.api.annotation.Drone)1 Assert.assertEquals (org.junit.Assert.assertEquals)1 Assert.assertNotNull (org.junit.Assert.assertNotNull)1 Assert.assertThat (org.junit.Assert.assertThat)1 Assert.assertTrue (org.junit.Assert.assertTrue)1