diff --git a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/ServiceAccountJwtAzureClientImpl.java b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/ServiceAccountJwtAzureClientImpl.java index 934dd8672caad9ed2ad945c1af2761d640d1b7b9..88d68e6cfc9dbc3070782945b9309e5a92650784 100644 --- a/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/ServiceAccountJwtAzureClientImpl.java +++ b/provider/notification-azure/src/main/java/org/opengroup/osdu/notification/provider/azure/util/ServiceAccountJwtAzureClientImpl.java @@ -14,82 +14,19 @@ package org.opengroup.osdu.notification.provider.azure.util; -import com.auth0.jwt.JWT; -import com.microsoft.aad.adal4j.AuthenticationContext; -import com.microsoft.aad.adal4j.AuthenticationResult; -import com.microsoft.aad.adal4j.ClientCredential; -import org.apache.http.HttpStatus; -import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.search.IdToken; -import org.opengroup.osdu.core.common.provider.interfaces.IJwtCache; +import org.opengroup.osdu.azure.util.AzureServicePrincipleTokenService; import org.opengroup.osdu.core.common.util.IServiceAccountJwtClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.net.MalformedURLException; -import java.util.concurrent.ExecutionException; -import java.util.concurrent.ExecutorService; -import java.util.concurrent.Executors; -import java.util.concurrent.Future; - @Component public class ServiceAccountJwtAzureClientImpl implements IServiceAccountJwtClient { @Autowired - private AppProperties config; - - @Autowired - private IJwtCache tenantJwtCache; - - public String getIdToken(String tenantName) { - String ACCESS_TOKEN = ""; - ExecutorService service = null; - - try { - // TODO : Refactor to move ID token form Common.Core.model.search to Common.core - IdToken cachedToken = (IdToken) this.tenantJwtCache.get(tenantName); - - if ((cachedToken != null) && !IdToken.refreshToken(cachedToken)) { - return "Bearer " + cachedToken.getTokenValue(); - } - - // TODO : Control the thread count via config and pool should be created once. - service = Executors.newFixedThreadPool(1); - - ACCESS_TOKEN = getAccessToken(service); - IdToken idToken = IdToken.builder().tokenValue(ACCESS_TOKEN).expirationTimeMillis(JWT.decode(ACCESS_TOKEN).getExpiresAt().getTime()).build(); - this.tenantJwtCache.put(tenantName, idToken); - } finally { - if(service != null) { - service.shutdown(); - } - } - return "Bearer " + ACCESS_TOKEN; - } - - // TODO : Refactor for making it test-able. - // THIS METHOD IS PUBLIC ONLY TO ENABLE UNIT TESTING - public String getAccessToken(ExecutorService service) { - AuthenticationContext context = null; - ClientCredential credential = null; - String ACCESS_TOKEN = null; - try { - context = new AuthenticationContext(this.config.getAuthURL(), false, service); - credential = new ClientCredential(this.config.getAuthClientID(), this.config.getAuthClientSecret()); - - Future<AuthenticationResult> future = context.acquireToken(this.config.getAadClientID(), credential, null); + private AzureServicePrincipleTokenService tokenService; - if (future == null) { - throw new AppException(HttpStatus.SC_FORBIDDEN, "Token not generated", "The user is not authorized to obtain Token From AAD"); - } - ACCESS_TOKEN = future.get().getAccessToken(); - } catch (MalformedURLException malformedURLException) { - malformedURLException.printStackTrace(); - } catch (InterruptedException e) { - e.printStackTrace(); - } catch (ExecutionException e) { - e.printStackTrace(); - } - return ACCESS_TOKEN; + @Override + public String getIdToken(String partitionId){ + return "Bearer " + this.tokenService.getAuthorizationToken(); } } diff --git a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/ServiceAccountClientImplTest.java b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/ServiceAccountClientImplTest.java index e7caf1d3bf93c6e74b665570e48cb94a0d5c7f3d..59fbfb854e7e3bca9ea106a1706b387890f74e1b 100644 --- a/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/ServiceAccountClientImplTest.java +++ b/provider/notification-azure/src/test/java/org/opengroup/osdu/notification/util/ServiceAccountClientImplTest.java @@ -14,104 +14,56 @@ package org.opengroup.osdu.notification.util; -import org.apache.http.HttpStatus; -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; -import org.junit.runner.RunWith; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.InjectMocks; import org.mockito.Mock; -import org.mockito.Spy; -import org.mockito.junit.MockitoJUnitRunner; -import org.opengroup.osdu.core.common.logging.JaxRsDpsLog; +import org.mockito.junit.jupiter.MockitoExtension; +import org.omg.CORBA.portable.ApplicationException; +import org.opengroup.osdu.azure.util.AzureServicePrincipleTokenService; import org.opengroup.osdu.core.common.model.http.AppException; -import org.opengroup.osdu.core.common.model.search.IdToken; -import org.opengroup.osdu.notification.provider.azure.cache.JwtCache; -import org.opengroup.osdu.notification.provider.azure.util.AppProperties; import org.opengroup.osdu.notification.provider.azure.util.ServiceAccountJwtAzureClientImpl; -import java.util.concurrent.ExecutorService; +import java.io.UnsupportedEncodingException; -import static org.junit.Assert.fail; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.Mockito.when; -import static org.mockito.MockitoAnnotations.initMocks; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.Mockito.*; +import static org.mockito.Mockito.times; -@RunWith(MockitoJUnitRunner.class) +@ExtendWith(MockitoExtension.class) public class ServiceAccountClientImplTest { - final String tenantName = "Test Tenant"; - final String validToken = "validToken"; - - @Mock - private IdToken idToken; - - @Mock - private ExecutorService executorService; - - @Mock - private AppProperties appProperties; - - @Mock - private JwtCache tenantJwtCacheMock; - - @Mock - private JaxRsDpsLog logger; + private static final String tenantId = "tenantId"; + private static final String token = "jwt-token"; @InjectMocks - @Spy - private ServiceAccountJwtAzureClientImpl sut; + private ServiceAccountJwtAzureClientImpl serviceAccountJwtAzureClient; - @Before - public void setup() { - initMocks(this); - idToken = IdToken.builder().tokenValue(validToken).expirationTimeMillis(System.currentTimeMillis() + 10000000L).build(); - } + @Mock + private AzureServicePrincipleTokenService azureServicePrincipleTokenService; @Test - public void should_getTokenFromCache_getIdTokenTest() { - // SetUp - when(tenantJwtCacheMock.get(any())).thenReturn(idToken); - String expectedToken = "Bearer " +idToken.getTokenValue(); + public void shouldSuccessfullyGenerateToken() throws UnsupportedEncodingException, ApplicationException { - // Act - String returnedIdToken = sut.getIdToken(tenantName); + when(azureServicePrincipleTokenService.getAuthorizationToken()).thenReturn(token); - // Assert - Assert.assertEquals(expectedToken, returnedIdToken); + String result = serviceAccountJwtAzureClient.getIdToken(tenantId); + + assertEquals("Bearer " + token, result); + verify(azureServicePrincipleTokenService, times(1)).getAuthorizationToken(); } @Test - public void should_updateCache_getIdTokenTest() { - // Set up - when(tenantJwtCacheMock.get(any())).thenReturn(idToken); - String expectedToken = "Bearer " +idToken.getTokenValue(); + public void shouldThrowAppException() throws UnsupportedEncodingException { - // Act - String returnedToken = this.sut.getIdToken(tenantName); + doThrow(AppException.class).when(azureServicePrincipleTokenService).getAuthorizationToken(); - // Assert - Assert.assertEquals(expectedToken, returnedToken); - } + AppException exception = assertThrows(AppException.class, () -> { + serviceAccountJwtAzureClient.getIdToken(tenantId); + }); - @Test - public void should_return403GivenInvalidApplicationProperties_getAccessToken() { - when(appProperties.getAuthURL()).thenReturn("https://login.microsoftonline.com/s/oauth2/token/"); - when(appProperties.getAuthClientID()).thenReturn("testAuthClientID"); - when(appProperties.getAuthClientSecret()).thenReturn("testAuthClientSecret"); - when(appProperties.getAadClientID()).thenReturn("testAadClientID"); - - try { - // Act - sut.getAccessToken(executorService); - - // Assert - fail("Should throw exception"); - } catch (AppException appException) { - Assert.assertEquals(HttpStatus.SC_FORBIDDEN, appException.getError().getCode()); - } catch (Exception e) { - fail("Should not throw this exception" + e.getMessage()); - } + assertNotNull(exception); + verify(azureServicePrincipleTokenService, times(1)).getAuthorizationToken(); } }