Commit ac35cda0 authored by Labros Papadopoulos's avatar Labros Papadopoulos
Browse files

feat: Use oidc provider url instead of base url for authorization

parent cc9fee94
Loading
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -19,6 +19,7 @@ public interface OssLifecycleDataToOssClientDataMapper {
    @Mapping(target = "id", ignore = true)
    @Mapping(target = "organizationId", ignore = true)
    @Mapping(target = "healthCheckCounter", ignore = true)
    @Mapping(target = "oauth2TokenUri", source = "authUrl")
    @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE)
    OssClientData mapToOssClientData(
            OssLifecycleData ossLifecycleData, @MappingTarget OssClientData ossClientData);
+2 −2
Original line number Diff line number Diff line
@@ -18,7 +18,7 @@ import lombok.ToString;
    "oauth2ClientId",
    "oauth2ClientSecret",
    "oauth2Scopes",
    "oauth2TokenUri",
    "authUrl",
    "username",
    "password"
})
@@ -38,7 +38,7 @@ public class OssLifecycleData {

    private String oauth2Scopes;

    private String oauth2TokenUri;
    private String authUrl;

    private String username;

+18 −16
Original line number Diff line number Diff line
package org.etsi.osl.hypo.api.peering.oss;

import io.quarkus.oidc.client.OidcClient;
import io.quarkus.oidc.client.OidcClientConfig;
import io.quarkus.oidc.client.OidcClientConfig.Grant.Type;
import io.quarkus.oidc.client.OidcClientConfigBuilder;
import io.quarkus.oidc.client.OidcClients;
import io.quarkus.oidc.client.runtime.OidcClientConfig;
import io.smallrye.mutiny.Uni;
import jakarta.enterprise.context.ApplicationScoped;
import jakarta.inject.Inject;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

@ApplicationScoped
public class OidcClientCreator {

    @Inject OidcClients oidcClients;
    private static final String openSliceRealm = "/auth/realms/openslice";

    public Uni<OidcClient> createOidcClient(
            String name, String url, String clientId, String secret, String username, String password) {
        OidcClientConfig cfg = new OidcClientConfig();
        cfg.setId(name);
        cfg.setAuthServerUrl(url + openSliceRealm);
        cfg.setClientId(clientId);
        cfg.getCredentials().setSecret(secret);
        cfg.getGrant().setType(Type.PASSWORD);
        cfg.setGrantOptions(Map.of("password", Map.of("username", username, "password", password)));
        List<String> scopes = new ArrayList<>();
        scopes.add("offline_access");
        cfg.setScopes(scopes);
            String name,
            String authUrl,
            String clientId,
            String secret,
            String username,
            String password) {
        OidcClientConfig cfg =
                new OidcClientConfigBuilder()
                        .id(name)
                        .authServerUrl(authUrl)
                        .clientId(clientId)
                        .credentials(secret)
                        .grant(OidcClientConfig.Grant.Type.PASSWORD)
                        .scopes("offline_access")
                        .grantOptions(Map.of("password", Map.of("username", username, "password", password)))
                        .build();
        return oidcClients.newClient(cfg);
    }
}
+13 −8
Original line number Diff line number Diff line
@@ -72,7 +72,8 @@ public class OssRestClientImpl {
            String oauth2ClientSecret,
            String username,
            String password,
            String organizationId) {
            String organizationId,
            String authUrl) {

        return executeWithRetry(
                baseUrl,
@@ -82,6 +83,7 @@ public class OssRestClientImpl {
                oauth2ClientSecret,
                username,
                password,
                authUrl,
                (client, token) -> {
                    Response response = client.getServiceSpecifications("Bearer " + token.getAccessToken());
                    String jsonResponse = response.readEntity(String.class);
@@ -98,7 +100,8 @@ public class OssRestClientImpl {
            String username,
            String password,
            String serviceSpecificationId,
            String organizationId) {
            String organizationId,
            String authUrl) {

        return executeWithRetry(
                baseUrl,
@@ -108,6 +111,7 @@ public class OssRestClientImpl {
                oauth2ClientSecret,
                username,
                password,
                authUrl,
                (client, token) -> {
                    Response response =
                            client.getServiceSpecificationById(
@@ -122,7 +126,7 @@ public class OssRestClientImpl {

    Tokens createToken(
            String name,
            String baseUrl,
            String authUrl,
            String oauth2ClientId,
            String oauth2ClientSecret,
            String username,
@@ -130,7 +134,7 @@ public class OssRestClientImpl {
        logger.debugf("Will retrieve a fresh token for org: %s", name);
        Uni<OidcClient> oidcClientUni =
                oidcClientCreator.createOidcClient(
                        name, baseUrl, oauth2ClientId, oauth2ClientSecret, username, password);
                        name, authUrl, oauth2ClientId, oauth2ClientSecret, username, password);
        TokensHelper tokenHelper = new TokensHelper();
        return tokenHelper.getTokens(oidcClientUni.await().indefinitely()).await().indefinitely();
    }
@@ -143,11 +147,12 @@ public class OssRestClientImpl {
            String secret,
            String user,
            String pass,
            String authUrl,
            BiFunctionWithException<OssRestClient, Tokens, T> action) {
        OssRestClient client = getCachedRestClient(baseUrl);

        // Compute token if missing
        Tokens tokens = getOrComputeToken(orgId, name, baseUrl, clientId, secret, user, pass);
        Tokens tokens = getOrComputeToken(orgId, name, authUrl, clientId, secret, user, pass);
        try {
            return action.apply(client, tokens);
        } catch (Exception e) {
@@ -155,7 +160,7 @@ public class OssRestClientImpl {
                    "Request failed for %s, attempting to refresh token and retry: " + e.getMessage(), name);

            // Force refresh token
            tokens = createToken(name, baseUrl, clientId, secret, user, pass);
            tokens = createToken(name, authUrl, clientId, secret, user, pass);
            tokenCache.put(orgId, tokens); // Update cache

            try {
@@ -189,12 +194,12 @@ public class OssRestClientImpl {
    Tokens getOrComputeToken(
            String orgId,
            String name,
            String baseUrl,
            String authUrl,
            String clientId,
            String secret,
            String user,
            String pass) {
        return tokenCache.get(orgId, k -> createToken(name, baseUrl, clientId, secret, user, pass));
        return tokenCache.get(orgId, k -> createToken(name, authUrl, clientId, secret, user, pass));
    }

    public void removeCachedToken(String organizationId) {
+7 −2
Original line number Diff line number Diff line
@@ -80,6 +80,9 @@ public class HealthCheckService {
                }

            } catch (Exception e) {
                logger.debugf(
                        "Heartbeat check failed for organization %s because of: %s",
                        ossClientDatum.getName(), e.getMessage());
                handleHealthCheckFailure(ossClientDatum, e);
            }
        }
@@ -96,7 +99,8 @@ public class HealthCheckService {
                        ossClientData.getOauth2ClientSecret(),
                        peeringInfoSecret.getUsername(),
                        peeringInfoSecret.getPassword(),
                        ossClientData.getOrganizationId());
                        ossClientData.getOrganizationId(),
                        ossClientData.getOauth2TokenUri());

        List<ServiceSpecificationEntity> updatedServiceSpecificationEntities = new ArrayList<>();

@@ -112,7 +116,8 @@ public class HealthCheckService {
                            peeringInfoSecret.getUsername(),
                            peeringInfoSecret.getPassword(),
                            entry.getKey(),
                            ossClientData.getOrganizationId());
                            ossClientData.getOrganizationId(),
                            ossClientData.getOauth2TokenUri());
            serviceSpecificationEntityList.add(serviceSpecificationEntity);
        }

Loading