diff --git a/src/integrationTest/java/org/opensearch/security/http/OnBehalfOfJwtAuthenticationTest.java b/src/integrationTest/java/org/opensearch/security/http/OnBehalfOfJwtAuthenticationTest.java index c4292386c6..5f19269970 100644 --- a/src/integrationTest/java/org/opensearch/security/http/OnBehalfOfJwtAuthenticationTest.java +++ b/src/integrationTest/java/org/opensearch/security/http/OnBehalfOfJwtAuthenticationTest.java @@ -19,6 +19,7 @@ import com.carrotsearch.randomizedtesting.annotations.ThreadLeakScope; import org.apache.hc.core5.http.Header; import org.apache.hc.core5.http.message.BasicHeader; +import org.junit.Assert; import org.junit.ClassRule; import org.junit.Test; import org.junit.runner.RunWith; @@ -34,6 +35,7 @@ import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.Matchers.hasKey; +import static org.junit.Assert; import static org.opensearch.test.framework.TestSecurityConfig.AuthcDomain.AUTHC_HTTPBASIC_INTERNAL; import static org.opensearch.test.framework.TestSecurityConfig.Role.ALL_ACCESS; @@ -75,60 +77,51 @@ public class OnBehalfOfJwtAuthenticationTest { @Test public void shouldAuthenticateWithOBOTokenEndPoint() { - Header adminOboAuthHeader; - - try (TestRestClient client = cluster.getRestClient(ADMIN_USER_NAME, DEFAULT_PASSWORD)) { - - client.assertCorrectCredentials(ADMIN_USER_NAME); - - TestRestClient.HttpResponse response = client.postJson(OBO_ENDPOINT_PREFIX, OBO_TOKEN_REASON); - response.assertStatusCode(200); - - Map oboEndPointResponse = response.getBodyAs(Map.class); - assertThat(oboEndPointResponse, allOf(aMapWithSize(3), hasKey("user"), hasKey("onBehalfOfToken"), hasKey("duration"))); - - String encodedOboTokenStr = oboEndPointResponse.get("onBehalfOfToken").toString(); - - adminOboAuthHeader = new BasicHeader("Authorization", "Bearer " + encodedOboTokenStr); - } - - try (TestRestClient client = cluster.getRestClient(adminOboAuthHeader)) { - - TestRestClient.HttpResponse response = client.getAuthInfo(); - response.assertStatusCode(200); - - String username = response.getTextFromJsonBody(POINTER_USERNAME); - assertThat(username, equalTo(ADMIN_USER_NAME)); - } + String oboToken = generateOboToken(ADMIN_USER_NAME, DEFAULT_PASSWORD); + Header adminOboAuthHeader = new BasicHeader("Authorization", "Bearer " + oboToken); + authenticateWithOboToken(adminOboAuthHeader, ADMIN_USER_NAME, 200); } @Test public void shouldNotAuthenticateWithATemperedOBOToken() { - Header adminOboAuthHeader; + String oboToken = generateOboToken(ADMIN_USER_NAME, DEFAULT_PASSWORD); + oboToken = oboToken.substring(0, oboToken.length() - 1); // tampering the token + Header adminOboAuthHeader = new BasicHeader("Authorization", "Bearer " + oboToken); + authenticateWithOboToken(adminOboAuthHeader, ADMIN_USER_NAME, 401); + } - try (TestRestClient client = cluster.getRestClient(ADMIN_USER_NAME, DEFAULT_PASSWORD)) { + @Test + public void shouldNotAuthenticateForUsingOBOTokenToAccessOBOEndpoint() { + String oboToken = generateOboToken(ADMIN_USER_NAME, DEFAULT_PASSWORD); + Header adminOboAuthHeader = new BasicHeader("Authorization", "Bearer " + oboToken); - client.assertCorrectCredentials(ADMIN_USER_NAME); + try (TestRestClient client = cluster.getRestClient(adminOboAuthHeader)) { + TestRestClient.HttpResponse response = client.getOBOToken(adminOboAuthHeader); + response.assertStatusCode(403); + } + } + private String generateOboToken(String username, String password) { + try (TestRestClient client = cluster.getRestClient(username, password)) { + client.assertCorrectCredentials(username); TestRestClient.HttpResponse response = client.postJson(OBO_ENDPOINT_PREFIX, OBO_TOKEN_REASON); response.assertStatusCode(200); - Map oboEndPointResponse = response.getBodyAs(Map.class); assertThat(oboEndPointResponse, allOf(aMapWithSize(3), hasKey("user"), hasKey("onBehalfOfToken"), hasKey("duration"))); - - String encodedOboTokenStr = oboEndPointResponse.get("onBehalfOfToken").toString(); - StringBuilder stringBuilder = new StringBuilder(encodedOboTokenStr); - stringBuilder.deleteCharAt(encodedOboTokenStr.length() - 1); - String temperedOboTokenStr = stringBuilder.toString(); - - adminOboAuthHeader = new BasicHeader("Authorization", "Bearer " + temperedOboTokenStr); + return oboEndPointResponse.get("onBehalfOfToken").toString(); } + } - try (TestRestClient client = cluster.getRestClient(adminOboAuthHeader)) { - + private void authenticateWithOboToken(Header authHeader, String expectedUsername, int expectedStatusCode) { + try (TestRestClient client = cluster.getRestClient(authHeader)) { TestRestClient.HttpResponse response = client.getAuthInfo(); - response.assertStatusCode(401); - response.getBody().contains("Unauthorized"); + response.assertStatusCode(expectedStatusCode); + if (expectedStatusCode == 200) { + String username = response.getTextFromJsonBody(POINTER_USERNAME); + assertThat(username, equalTo(expectedUsername)); + } else { + Assert.assertTrue(response.getBody().contains("Unauthorized")); + } } } } diff --git a/src/integrationTest/java/org/opensearch/test/framework/cluster/TestRestClient.java b/src/integrationTest/java/org/opensearch/test/framework/cluster/TestRestClient.java index f446cac933..0d343c06bd 100644 --- a/src/integrationTest/java/org/opensearch/test/framework/cluster/TestRestClient.java +++ b/src/integrationTest/java/org/opensearch/test/framework/cluster/TestRestClient.java @@ -135,6 +135,10 @@ public HttpResponse getAuthInfo(Header... headers) { return executeRequest(new HttpGet(getHttpServerUri() + "/_opendistro/_security/authinfo?pretty"), headers); } + public HttpResponse getOBOToken(Header... headers) { + return executeRequest(new HttpPost(getHttpServerUri() + "/_plugin/_security/api/user/onbehalfof?pretty"), headers); + } + public void assertCorrectCredentials(String expectedUserName) { HttpResponse response = getAuthInfo(); assertThat(response, notNullValue()); diff --git a/src/main/java/org/opensearch/security/support/HTTPHelper.java b/src/main/java/org/opensearch/security/support/HTTPHelper.java index 4ef5235d53..a3c9202d02 100644 --- a/src/main/java/org/opensearch/security/support/HTTPHelper.java +++ b/src/main/java/org/opensearch/security/support/HTTPHelper.java @@ -104,7 +104,7 @@ public static boolean containsBadHeader(final RestRequest request) { return false; } - public static boolean containsOBOToken(final RestRequest request){ + public static boolean containsOBOToken(final RestRequest request) { final Map> headers; if (request != null && (headers = request.getHeaders()) != null) {