001
002package io.vrap.rmf.base.client.http;
003
004import java.time.Duration;
005
006import io.vrap.rmf.base.client.AuthenticationToken;
007import io.vrap.rmf.base.client.AutoCloseableService;
008import io.vrap.rmf.base.client.oauth2.InMemoryTokenSupplier;
009import io.vrap.rmf.base.client.oauth2.RefreshableTokenSupplier;
010import io.vrap.rmf.base.client.oauth2.TokenSupplier;
011import io.vrap.rmf.base.client.utils.ClientUtils;
012
013/**
014 * Handler for retrieving an oauth authentication token
015 */
016public class OAuthHandler extends AutoCloseableService {
017    public static final Duration WAIT_TIMEOUT = Duration.ofSeconds(5);
018    private final Duration waitTimeout;
019    private final RefreshableTokenSupplier supplier;
020
021    public OAuthHandler(final TokenSupplier supplier) {
022        this(supplier, WAIT_TIMEOUT);
023    }
024
025    public OAuthHandler(final TokenSupplier supplier, Duration waitTimeout) {
026        if (supplier instanceof RefreshableTokenSupplier) {
027            this.supplier = (RefreshableTokenSupplier) supplier;
028        }
029        else {
030            this.supplier = new InMemoryTokenSupplier(supplier);
031        }
032        this.waitTimeout = waitTimeout;
033    }
034
035    static String authHeader(final AuthenticationToken token) {
036        return "Bearer " + token.getAccessToken();
037    }
038
039    public AuthenticationToken getToken() {
040        final AuthenticationToken token = ClientUtils.blockingWait(supplier.getToken(), waitTimeout);
041        if (token.isExpired()) {
042            return refreshToken();
043        }
044        return token;
045    }
046
047    public AuthenticationToken refreshToken() {
048        return ClientUtils.blockingWait(supplier.refreshToken(), waitTimeout);
049    }
050
051    @Override
052    protected void internalClose() {
053        if (supplier instanceof AutoCloseable)
054            closeQuietly((AutoCloseable) supplier);
055    }
056}