private async Task Login() { var cookieContainer = new CookieContainer(); var handler = new HttpClientHandler { CookieContainer = cookieContainer }; using (var client = new HttpClient(handler)) { client.DefaultRequestHeaders.Add("User-Agent", "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:55.0) Gecko/20100101 Firefox/55.0"); // Get the csrf_token var page = await client.GetAsync(UrlLogin); var document = new HtmlDocument(); document.LoadHtml(await page.Content.ReadAsStringAsync()); var csrf = document.DocumentNode .Descendants("meta") .First(node => node.Attributes["name"]?.Value == "csrf_token") .Attributes["content"].Value; // Create the request var pairs = new Dictionary <string, string> { { "user_name", _credentialsRepository.MyAnimeListConfig.Username }, { "password", _credentialsRepository.MyAnimeListConfig.Password }, { "cookie", "1" }, { "sublogin", "Login" }, { "submit", "1" }, { "csrf_token", csrf } }; var content = new FormUrlEncodedContent(pairs); var request = await client.PostAsync(UrlLogin, content); var cookies = string.Join("; ", cookieContainer.GetCookies(new Uri(UrlLogin)) .Cast <Cookie>() .Select(cookie => cookie.ToString())); // Save information to disk _credentials.CsrfToken = csrf; _credentials.CsrfTokenLastRetrieved = DateTime.Now; _credentials.Cookies = cookies; _credentialsRepository.Save(); } }
// public MyAnimeListInternalApi(ICredentialsRepository credentialsRepository, IDetailProviderService detailProvider) { _credentialsRepository = credentialsRepository; _detailProvider = detailProvider; // Remove any api details on any changes to login credentials _credentialsRepository.MyAnimeListConfig.PropertyChanged += (sender, args) => { if (args.PropertyName == "Username" || args.PropertyName == "Password") { _credentialsRepository.MyAnimeListConfig.Credentials = new ApiCredentials(); _credentialsRepository.Save(); _clientReady = false; } }; _client = new HttpClient(new HttpClientHandler { UseCookies = false, AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate }); _credentials = _credentialsRepository.MyAnimeListConfig.Credentials; }
// Auth related private async Task CheckAuthentication() { ApiCredentials credentials = null; // never retrieved: retrieve if (_credentials == null) { credentials = await GetCredentials(); } // token expired: update else if (_credentials?.ExpiresDateTime < DateTime.Now) { credentials = await GetCredentials(); } // a change was required to be made, save new credentials to settings if (credentials != null) { _credentials = credentials; _credentialsRepository.AniListConfiguration.Credentials = credentials; _credentialsRepository.Save(); } }