private async Task <string> CreateSpreadsheet(Auth0UserDto user, dynamic json) { var spreadsheetJson = new StringContent(JsonConvert.SerializeObject(json, Formatting.Indented, new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore }), Encoding.UTF8, "application/json"); var client = _clientFactory.CreateClient(); client.DefaultRequestHeaders.Add("Authorization", $"Bearer {user.Identities.FirstOrDefault(x => x.Provider == "google-oauth2")?.AccessToken}"); using var httpResponse = await client.PostAsync("https://sheets.googleapis.com/v4/spreadsheets", spreadsheetJson); if (httpResponse.IsSuccessStatusCode) { var responseAsString = await httpResponse.Content.ReadAsStringAsync(); return(responseAsString); } if (httpResponse.StatusCode == HttpStatusCode.Unauthorized) { var refreshedUser = await _googleAuthService.GetNewAccessTokenAsync(user); if (_memoryCache.TryGetValue(user.UserId, out Auth0UserDto cachedUser)) { _memoryCache.Remove(user.UserId); } var cacheEntryOptions = new MemoryCacheEntryOptions() .SetAbsoluteExpiration( TimeSpan.FromSeconds(refreshedUser.Identities.FirstOrDefault()?.ExpiresIn ?? 0)); // Save data in cache. _memoryCache.Set(user.UserId, user, cacheEntryOptions); return(await CreateSpreadsheet(refreshedUser, json)); } return(null); }
public async Task <Auth0UserDto> GetNewAccessTokenAsync(Auth0UserDto user) { var client = _clientFactory.CreateClient(); var googleIdentity = user.Identities?.FirstOrDefault(x => x.Provider == "google-oauth2"); if (googleIdentity != null) { var jsonContent = JsonConvert.SerializeObject(new { client_id = _configuration.ClientId, client_secret = _configuration.ClientSecret, refresh_token = googleIdentity?.RefreshToken, grant_type = "refresh_token" }); var stringContent = new StringContent(jsonContent, Encoding.UTF8, "application/json"); client.BaseAddress = new Uri("https://oauth2.googleapis.com/token"); var httpResponse = await client.PostAsync("/token", stringContent); if (httpResponse.IsSuccessStatusCode) { var responseAsString = await httpResponse.Content.ReadAsStringAsync(); var authToken = JsonConvert.DeserializeObject <TokenResponseDto>(responseAsString); googleIdentity.AccessToken = authToken.AccessToken; googleIdentity.ExpiresIn = authToken.ExpiresIn; return(user); } } return(null); }