private static bool RefreshAccess(IList <IYoutubeAccountAccess> access) { var firstOutdatedAccess = access.FirstOrDefault(ac => !ac.Client.LimitReached && ac.IsExpired && ac.RefreshAllowed); bool result = false; if (firstOutdatedAccess != null) { LOGGER.Info($"Found an outdated access, refreshing it"); // Content zusammenbauen string content = $"client_id={YoutubeClientData.Client.Id}&client_secret={YoutubeClientData.Client.Secret}&refresh_token={firstOutdatedAccess.RefreshToken}&grant_type=refresh_token"; var bytes = Encoding.UTF8.GetBytes(content); // Request erstellen WebRequest request = WebRequest.Create($"https://www.googleapis.com/oauth2/v4/token"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; var response = WebService.Communicate(request, bytes); if (response != null && !response.Contains("revoked")) { LOGGER.Info($"Refresh was successful"); result = true; // Account var authResponse = JsonConvert.DeserializeObject <YoutubeAuthResponse>(response); if (!string.IsNullOrWhiteSpace(authResponse.access_token)) { var newAccess = new YoutubeAccountAccess(); newAccess.Client = firstOutdatedAccess.Client; newAccess.AccessToken = authResponse.access_token; newAccess.TokenType = authResponse.token_type; newAccess.ExpirationDate = DateTime.Now.AddSeconds(authResponse.expires_in); newAccess.RefreshToken = firstOutdatedAccess.RefreshToken; newAccess.ClientId = firstOutdatedAccess.ClientId; newAccess.HasSendMailPrivilegue = firstOutdatedAccess.HasSendMailPrivilegue; access.Remove(firstOutdatedAccess); access.Add(newAccess); } else { firstOutdatedAccess.NextRefreshAllowed = DateTime.Now.Add(new TimeSpan(1, 0, 0)); } } else { LOGGER.Info($"Access has been revoked and cannot be refreshed anymore"); } } return(result); }
public IYoutubeAccount ConnectToAccount(string code, bool mailsAllowed, IYoutubeClient client, YoutubeRedirectUri redirectUri) { LOGGER.Info($"Connecting to account, mails allowed: {mailsAllowed}, redirect uri: {redirectUri}"); var uri = redirectUri.GetAttribute <EnumMemberAttribute>().Value; string content = $"code={code}&client_id={client.Id}&client_secret={client.Secret}&redirect_uri={uri}&grant_type=authorization_code"; var bytes = Encoding.UTF8.GetBytes(content); // Request erstellen WebRequest request = WebRequest.Create("https://www.googleapis.com/oauth2/v4/token"); request.Method = "POST"; request.ContentType = "application/x-www-form-urlencoded"; string result = WebService.Communicate(request, bytes); QuotaProblemHandler.ThrowOnQuotaLimitReached(result); IYoutubeAccount account = null; var authResponse = JsonConvert.DeserializeObject <YoutubeAuthResponse>(result); IYoutubeAccountAccess access = new YoutubeAccountAccess(); access.Client = client; access.HasSendMailPrivilegue = mailsAllowed; if (authResponse != null && !string.IsNullOrWhiteSpace(authResponse.access_token)) { access.AccessToken = authResponse.access_token; access.RefreshToken = authResponse.refresh_token; access.TokenType = authResponse.token_type; access.ExpirationDate = DateTime.Now.AddSeconds(authResponse.expires_in); access.ClientId = client.Id; LOGGER.Info($"Connection successful, loading account details"); var accountDetails = GetAccountDetails(access); var acc = accountDetails.items.First(); account = YoutubeAccount.Create(acc.id, acc.snippet.country, acc.snippet.title); account.Access.Add(access); } LOGGER.Info($"Connected to account with id: {account.Id} and title: '{account.Title}'"); return(account); }