コード例 #1
0
 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));
     }
 }
コード例 #2
0
        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);
        }