/// <summary> /// Pre-authentication /// </summary> /// <remarks>This step is to get the login page for later use</remarks> /// <returns></returns> public PreAuthResponse PreAuth() { var request = new ProxiedWebRequest(authorize); request.UserAgent = userAgent; var response = request.Get(); string html = response.Body; string PPFT = ppft.Match(html).Groups[1].Value; string urlPost = this.urlPost.Match(html).Groups[1].Value; if (string.IsNullOrEmpty(PPFT) || string.IsNullOrEmpty(urlPost)) { throw new Exception("Fail to extract PPFT or urlPost"); } //Console.WriteLine("PPFT: {0}", PPFT); //Console.WriteLine(); //Console.WriteLine("urlPost: {0}", urlPost); return(new PreAuthResponse() { UrlPost = urlPost, PPFT = PPFT, Cookie = response.Cookies }); }
/// <summary> /// Check if user own Minecraft by access token /// </summary> /// <param name="accessToken"></param> /// <returns>True if the user own the game</returns> public bool UserHasGame(string accessToken) { var request = new ProxiedWebRequest(ownership); request.Headers.Add("Authorization", string.Format("Bearer {0}", accessToken)); var response = request.Get(); if (Settings.DebugMessages) { ConsoleIO.WriteLine(response.ToString()); } string jsonString = response.Body; Json.JSONData json = Json.ParseJson(jsonString); return(json.Properties["items"].DataArray.Count > 0); }
public UserProfile GetUserProfile(string accessToken) { var request = new ProxiedWebRequest(profile); request.Headers.Add("Authorization", string.Format("Bearer {0}", accessToken)); var response = request.Get(); if (Settings.DebugMessages) { ConsoleIO.WriteLine(response.ToString()); } string jsonString = response.Body; Json.JSONData json = Json.ParseJson(jsonString); return(new UserProfile() { UUID = json.Properties["id"].StringValue, UserName = json.Properties["name"].StringValue }); }
/// <summary> /// Perform login request /// </summary> /// <remarks>This step is to send the login request by using the PreAuth response</remarks> /// <param name="email">Microsoft account email</param> /// <param name="password">Account password</param> /// <param name="preAuth"></param> /// <returns></returns> public UserLoginResponse UserLogin(string email, string password, PreAuthResponse preAuth) { var request = new ProxiedWebRequest(preAuth.UrlPost, preAuth.Cookie); request.UserAgent = userAgent; string postData = "login="******"&loginfmt=" + Uri.EscapeDataString(email) + "&passwd=" + Uri.EscapeDataString(password) + "&PPFT=" + Uri.EscapeDataString(preAuth.PPFT); var response = request.Post("application/x-www-form-urlencoded", postData); if (Settings.DebugMessages) { ConsoleIO.WriteLine(response.ToString()); } if (response.StatusCode >= 300 && response.StatusCode <= 399) { string url = response.Headers.Get("Location"); string hash = url.Split('#')[1]; var request2 = new ProxiedWebRequest(url); var response2 = request2.Get(); if (response2.StatusCode != 200) { throw new Exception("Authentication failed"); } if (string.IsNullOrEmpty(hash)) { if (confirm.IsMatch(response2.Body)) { throw new Exception("Activity confirmation required"); } else { throw new Exception("Invalid credentials or 2FA enabled"); } } var dict = Request.ParseQueryString(hash); //foreach (var pair in dict) //{ // Console.WriteLine("{0}: {1}", pair.Key, pair.Value); //} return(new UserLoginResponse() { AccessToken = dict["access_token"], RefreshToken = dict["refresh_token"], ExpiresIn = int.Parse(dict["expires_in"]) }); } else { throw new Exception("Unexpected response. Check your credentials. Response code: " + response.StatusCode); } }
/// <summary> /// Perform login request /// </summary> /// <remarks>This step is to send the login request by using the PreAuth response</remarks> /// <param name="email">Microsoft account email</param> /// <param name="password">Account password</param> /// <param name="preAuth"></param> /// <returns></returns> public static Microsoft.LoginResponse UserLogin(string email, string password, PreAuthResponse preAuth) { var request = new ProxiedWebRequest(preAuth.UrlPost, preAuth.Cookie); request.UserAgent = userAgent; string postData = "login="******"&loginfmt=" + Uri.EscapeDataString(email) + "&passwd=" + Uri.EscapeDataString(password) + "&PPFT=" + Uri.EscapeDataString(preAuth.PPFT); var response = request.Post("application/x-www-form-urlencoded", postData); if (Settings.DebugMessages) { ConsoleIO.WriteLine(response.ToString()); } if (response.StatusCode >= 300 && response.StatusCode <= 399) { string url = response.Headers.Get("Location"); string hash = url.Split('#')[1]; var request2 = new ProxiedWebRequest(url); var response2 = request2.Get(); if (response2.StatusCode != 200) { throw new Exception("Authentication failed"); } if (string.IsNullOrEmpty(hash)) { throw new Exception("Cannot extract access token"); } var dict = Request.ParseQueryString(hash); //foreach (var pair in dict) //{ // Console.WriteLine("{0}: {1}", pair.Key, pair.Value); //} return(new Microsoft.LoginResponse() { Email = email, AccessToken = dict["access_token"], RefreshToken = dict["refresh_token"], ExpiresIn = int.Parse(dict["expires_in"]) }); } else { if (twoFA.IsMatch(response.Body)) { // TODO: Handle 2FA throw new Exception("2FA enabled but not supported yet. Use browser sign-in method or try to disable 2FA in Microsoft account settings"); } else if (invalidAccount.IsMatch(response.Body)) { throw new Exception("Invalid credentials. Check your credentials"); } else { throw new Exception("Unexpected response. Check your credentials. Response code: " + response.StatusCode); } } }