private static async Task <string> DiscoverServiceAccountIdAsync( HttpClientFactory clientFactory) { using (var client = clientFactory.CreateDefaultHttpClient()) { client.DefaultRequestHeaders.Add("Metadata-Flavor", "Google"); return(await client.GetStringAsync(MetadataServerUrl).ConfigureAwait(false)); } }
public async Task <IReadOnlyList <PublicKey> > GetPublicKeysAsync( CancellationToken cancellationToken = default(CancellationToken)) { if (_cachedKeys == null || _clock.UtcNow >= _expirationTime) { await _lock.WaitAsync(cancellationToken).ConfigureAwait(false); try { var now = _clock.UtcNow; if (_cachedKeys == null || now >= _expirationTime) { using (var httpClient = _clientFactory.CreateDefaultHttpClient()) { var response = await httpClient.GetAsync(_certUrl, cancellationToken) .ConfigureAwait(false); response.EnsureSuccessStatusCode(); _cachedKeys = ParseKeys(await response.Content.ReadAsStringAsync() .ConfigureAwait(false)); var cacheControl = response.Headers.CacheControl; if (cacheControl?.MaxAge != null) { _expirationTime = now.Add(cacheControl.MaxAge.Value) .Subtract(ClockSkew); } } } } catch (HttpRequestException e) { throw new FirebaseException("Failed to retrieve latest public keys.", e); } finally { _lock.Release(); } } return(_cachedKeys); }