keycloak-aplcache
Changes
testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java 59(+59 -0)
testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties 1(+1 -0)
testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html 11(+11 -0)
testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java 19(+19 -0)
testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/AbstractSpringBootTest.java 156(+65 -91)
Details
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
index d214a48..b53481b 100644
--- a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/pom.xml
@@ -23,17 +23,27 @@
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
- <keycloak.version>-</keycloak.version>
+ <keycloak.version>3.3.0.CR1-SNAPSHOT</keycloak.version>
</properties>
<dependencies>
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-thymeleaf</artifactId>
+ </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
-
+
+ <dependency>
+ <groupId>org.springframework.boot</groupId>
+ <artifactId>spring-boot-starter-web</artifactId>
+ </dependency>
+
<dependency>
<groupId>org.keycloak</groupId>
<artifactId>keycloak-spring-boot-adapter</artifactId>
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java
new file mode 100644
index 0000000..3b9ccc4
--- /dev/null
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/java/org/keycloak/AdminController.java
@@ -0,0 +1,59 @@
+package org.keycloak;
+
+import java.io.IOException;
+import java.util.Map;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.keycloak.adapters.RefreshableKeycloakSecurityContext;
+import org.keycloak.common.util.Time;
+import org.keycloak.jose.jws.JWSInput;
+import org.keycloak.jose.jws.JWSInputException;
+import org.keycloak.representations.RefreshToken;
+import org.keycloak.util.JsonSerialization;
+import org.springframework.stereotype.Controller;
+import org.springframework.ui.Model;
+import org.springframework.util.NumberUtils;
+import org.springframework.util.StringUtils;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestMethod;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.context.request.WebRequest;
+
+@Controller
+@RequestMapping(path = "/admin")
+public class AdminController {
+
+ @RequestMapping(path = "/TokenServlet", method = RequestMethod.GET)
+ public String showTokens(WebRequest req, Model model, @RequestParam Map<String, String> attributes) throws IOException {
+ String timeOffset = attributes.get("timeOffset");
+ if (!StringUtils.isEmpty(timeOffset)) {
+ int offset;
+ try {
+ offset = Integer.parseInt(timeOffset, 10);
+ }
+ catch (NumberFormatException e) {
+ offset = 0;
+ }
+
+ Time.setOffset(offset);
+ }
+
+ RefreshableKeycloakSecurityContext ctx =
+ (RefreshableKeycloakSecurityContext) req.getAttribute(KeycloakSecurityContext.class.getName(), WebRequest.SCOPE_REQUEST);
+ String accessTokenPretty = JsonSerialization.writeValueAsPrettyString(ctx.getToken());
+ RefreshToken refreshToken;
+ try {
+ refreshToken = new JWSInput(ctx.getRefreshToken()).readJsonContent(RefreshToken.class);
+ } catch (JWSInputException e) {
+ throw new IOException(e);
+ }
+ String refreshTokenPretty = JsonSerialization.writeValueAsPrettyString(refreshToken);
+
+ model.addAttribute("accessToken", accessTokenPretty);
+ model.addAttribute("refreshToken", refreshTokenPretty);
+ model.addAttribute("accessTokenString", ctx.getTokenString());
+
+ return "tokens";
+ }
+}
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
index d8749d3..84de1bb 100644
--- a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/application.properties
@@ -5,6 +5,7 @@ keycloak.auth-server-url=http://localhost:8180/auth
keycloak.ssl-required=external
keycloak.resource=spring-boot-app
keycloak.credentials.secret=e3789ac5-bde6-4957-a7b0-612823dac101
+keycloak.realm-key=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCrVrCuTtArbgaZzL1hvh0xtL5mc7o0NqPVnYXkLvgcwiC3BjLGw1tGEGoJaXDuSaRllobm53JBhjx33UNv+5z/UMG4kytBWxheNVKnL6GgqlNabMaFfPLPCF8kAgKnsi79NMo+n6KnSY8YeUmec/p2vjO2NjsSAVcWEQMVhJ31LwIDAQAB
keycloak.security-constraints[0].authRoles[0]=admin
keycloak.security-constraints[0].securityCollections[0].name=Admin zone
diff --git a/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html
new file mode 100644
index 0000000..09dee72
--- /dev/null
+++ b/testsuite/integration-arquillian/test-apps/spring-boot-adapter/src/main/resources/templates/tokens.html
@@ -0,0 +1,11 @@
+<!DOCTYPE HTML>
+<html xmlns:th="http://www.thymeleaf.org/">
+ <head>
+ <title>Tokens from spring boot</title>
+ </head>
+ <body>
+ <span id="accessToken" th:text="${accessToken}"></span>
+ <span id="refreshToken" th:text="${refreshToken}"></span>
+ <span id="accessTokenString" th:text="${accessTokenString}"></span>
+ </body>
+</html>
\ No newline at end of file
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java
new file mode 100644
index 0000000..7fc7961
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/main/java/org/keycloak/testsuite/springboot/TokenPage.java
@@ -0,0 +1,19 @@
+package org.keycloak.testsuite.springboot;
+
+import java.net.URL;
+
+import org.jboss.arquillian.test.api.ArquillianResource;
+import org.keycloak.testsuite.adapter.page.AbstractShowTokensPage;
+
+public class TokenPage extends AbstractShowTokensPage {
+
+ @Override
+ public boolean isCurrent() {
+ return driver.getTitle().equalsIgnoreCase("tokens from spring boot");
+ }
+
+ @Override
+ public URL getInjectedUrl() {
+ return null;
+ }
+}
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java
new file mode 100644
index 0000000..6aea719
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/BasicSpringBootTest.java
@@ -0,0 +1,61 @@
+package org.keycloak.testsuite.springboot;
+
+import org.junit.Assert;
+import org.junit.Test;
+
+public class BasicSpringBootTest extends AbstractSpringBootTest {
+ @Test
+ public void testCorrectUser() {
+ driver.navigate().to(APPLICATION_URL + "/index.html");
+
+ Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+ applicationPage.goAdmin();
+
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+ loginPage.login(USER_LOGIN, USER_PASSWORD);
+
+ Assert.assertTrue("Must be on admin page", adminPage.isCurrent());
+ Assert.assertTrue("Admin page must contain correct div",
+ driver.getPageSource().contains("You are now admin"));
+
+ driver.navigate().to(logoutPage(BASE_URL));
+
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+ }
+
+ @Test
+ public void testIncorrectUser() {
+ driver.navigate().to(APPLICATION_URL + "/index.html");
+
+ Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+ applicationPage.goAdmin();
+
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+ loginPage.login(USER_LOGIN_2, USER_PASSWORD_2);
+
+ Assert.assertTrue("Must return 403 because of incorrect role",
+ driver.getPageSource().contains("There was an unexpected error (type=Forbidden, status=403)")
+ || driver.getPageSource().contains("\"status\":403,\"error\":\"Forbidden\""));
+ }
+
+ @Test
+ public void testIncorrectCredentials() {
+ driver.navigate().to(APPLICATION_URL + "/index.html");
+
+ Assert.assertTrue("Must be on application page", applicationPage.isCurrent());
+
+ applicationPage.goAdmin();
+
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+
+ loginPage.login(USER_LOGIN, USER_PASSWORD_2);
+
+ Assert.assertEquals("Error message about password",
+ "Invalid username or password.", loginPage.getError());
+ }
+}
diff --git a/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java
new file mode 100644
index 0000000..9c86e8a
--- /dev/null
+++ b/testsuite/integration-arquillian/tests/other/springboot-tests/src/test/java/org/keycloak/testsuite/springboot/TokenSpringBootTest.java
@@ -0,0 +1,42 @@
+package org.keycloak.testsuite.springboot;
+
+import org.junit.Assert;
+import org.junit.Test;
+import org.keycloak.OAuth2Constants;
+import org.keycloak.testsuite.util.WaitUtils;
+import org.keycloak.util.TokenUtil;
+import org.openqa.selenium.By;
+
+public class TokenSpringBootTest extends AbstractSpringBootTest {
+ @Test
+ public void testTokens() {
+ String servletUri = APPLICATION_URL + "/admin/TokenServlet";
+
+ driver.navigate().to(servletUri + "?" + OAuth2Constants.SCOPE + "=" + OAuth2Constants.OFFLINE_ACCESS);
+
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+ loginPage.login(USER_LOGIN, USER_PASSWORD);
+
+ WaitUtils.waitUntilElement(By.tagName("body")).is().visible();
+
+ Assert.assertTrue(tokenPage.isCurrent());
+
+ Assert.assertEquals(tokenPage.getRefreshToken().getType(), TokenUtil.TOKEN_TYPE_OFFLINE);
+ Assert.assertEquals(tokenPage.getRefreshToken().getExpiration(), 0);
+
+ String accessTokenId = tokenPage.getAccessToken().getId();
+ String refreshTokenId = tokenPage.getRefreshToken().getId();
+
+ setAdapterAndServerTimeOffset(9999, servletUri);
+
+ driver.navigate().to(servletUri);
+ Assert.assertTrue("Must be on tokens page", tokenPage.isCurrent());
+ Assert.assertNotEquals(tokenPage.getRefreshToken().getId(), refreshTokenId);
+ Assert.assertNotEquals(tokenPage.getAccessToken().getId(), accessTokenId);
+
+ setAdapterAndServerTimeOffset(0, servletUri);
+
+ driver.navigate().to(logoutPage(servletUri));
+ Assert.assertTrue("Must be on login page", loginPage.isCurrent());
+ }
+}