private void LogHttpResponse(HttpResponseMessage request) { _logger?.LogResponse(request); }
/// <summary> /// Login using given credentials asynchronously /// </summary> /// <returns> /// Success --> is succeed /// TwoFactorRequired --> requires 2FA login. /// BadPassword --> Password is wrong /// InvalidUser --> User/phone number is wrong /// Exception --> Something wrong happened /// </returns> public async Task <IResult <InstaLoginResult> > LoginAsync() { ValidateUser(); ValidateRequestMessage(); try { var firstResponse = await _httpRequestProcessor.GetAsync(_httpRequestProcessor.Client.BaseAddress); var cookies = _httpRequestProcessor.HttpHandler.CookieContainer.GetCookies(_httpRequestProcessor.Client .BaseAddress); _logger?.LogResponse(firstResponse); var csrftoken = cookies[InstaApiConstants.CSRFTOKEN]?.Value ?? String.Empty; _user.CsrfToken = csrftoken; var instaUri = UriCreator.GetLoginUri(); var signature = $"{_httpRequestProcessor.RequestMessage.GenerateSignature(InstaApiConstants.IG_SIGNATURE_KEY)}.{_httpRequestProcessor.RequestMessage.GetMessageString()}"; var fields = new Dictionary <string, string> { { InstaApiConstants.HEADER_IG_SIGNATURE, signature }, { InstaApiConstants.HEADER_IG_SIGNATURE_KEY_VERSION, InstaApiConstants.IG_SIGNATURE_KEY_VERSION } }; var request = HttpHelper.GetDefaultRequest(HttpMethod.Post, instaUri, _deviceInfo); request.Content = new FormUrlEncodedContent(fields); request.Properties.Add(InstaApiConstants.HEADER_IG_SIGNATURE, signature); request.Properties.Add(InstaApiConstants.HEADER_IG_SIGNATURE_KEY_VERSION, InstaApiConstants.IG_SIGNATURE_KEY_VERSION); var response = await _httpRequestProcessor.SendAsync(request); var json = await response.Content.ReadAsStringAsync(); if (response.StatusCode != HttpStatusCode.OK) //If the password is correct BUT 2-Factor Authentication is enabled, it will still get a 400 error (bad request) { //Then check it var loginFailReason = JsonConvert.DeserializeObject <InstaLoginBaseResponse>(json); if (loginFailReason.InvalidCredentials) { return(Result.Fail("Invalid Credentials", loginFailReason.ErrorType == "bad_password" ? InstaLoginResult.BadPassword : InstaLoginResult.InvalidUser)); } if (loginFailReason.TwoFactorRequired) { _twoFactorInfo = loginFailReason.TwoFactorLoginInfo; //2FA is required! return(Result.Fail("Two Factor Authentication is required", InstaLoginResult.TwoFactorRequired)); } return(Result.UnExpectedResponse <InstaLoginResult>(response, json)); } var loginInfo = JsonConvert.DeserializeObject <InstaLoginResponse>(json); IsUserAuthenticated = loginInfo.User?.UserName.ToLower() == _user.UserName.ToLower(); var converter = ConvertersFabric.Instance.GetUserShortConverter(loginInfo.User); _user.LoggedInUder = converter.Convert(); _user.RankToken = $"{_user.LoggedInUder.Pk}_{_httpRequestProcessor.RequestMessage.phone_id}"; return(Result.Success(InstaLoginResult.Success)); } catch (Exception exception) { LogException(exception); return(Result.Fail(exception, InstaLoginResult.Exception)); } finally { InvalidateProcessors(); } }