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}