MobileLoginRequest() 공개 정적인 메소드

Perform a mobile login request
public static MobileLoginRequest ( string url, string method, NameValueCollection data = null, CookieContainer cookies = null, NameValueCollection headers = null ) : string
url string API url
method string GET or POST
data System.Collections.Specialized.NameValueCollection Name-data pairs
cookies System.Net.CookieContainer current cookie container
headers System.Collections.Specialized.NameValueCollection
리턴 string
예제 #1
0
        public bool DeactivateAuthenticator(int scheme = 2)
        {
            var postData = new NameValueCollection();

            postData.Add("steamid", this.Session.SteamID.ToString());
            postData.Add("steamguard_scheme", scheme.ToString());
            postData.Add("revocation_code", this.RevocationCode);
            postData.Add("access_token", this.Session.OAuthToken);

            try
            {
                string response       = SteamWeb.MobileLoginRequest(APIEndpoints.STEAMAPI_BASE + "/ITwoFactorService/RemoveAuthenticator/v0001", "POST", postData);
                var    removeResponse = JsonConvert.DeserializeObject <RemoveAuthenticatorResponse>(response);

                if (removeResponse == null || removeResponse.Response == null || !removeResponse.Response.Success)
                {
                    return(false);
                }
                return(true);
            }
            catch (Exception)
            {
                return(false);
            }
        }
예제 #2
0
        public LinkResult AddAuthenticator()
        {
            bool hasPhone = _hasPhoneAttached();

            if (hasPhone && PhoneNumber != null)
            {
                return(LinkResult.MustRemovePhoneNumber);
            }
            if (!hasPhone && PhoneNumber == null)
            {
                return(LinkResult.MustProvidePhoneNumber);
            }

            if (!hasPhone)
            {
                if (!_addPhoneNumber())
                {
                    return(LinkResult.GeneralFailure);
                }
            }

            var postData = new NameValueCollection();

            postData.Add("access_token", _session.OAuthToken);
            postData.Add("steamid", _session.SteamID.ToString());
            postData.Add("authenticator_type", "1");
            postData.Add("device_identifier", this.DeviceID);
            postData.Add("sms_phone_id", "1");

            string response = SteamWeb.MobileLoginRequest(APIEndpoints.STEAMAPI_BASE + "/ITwoFactorService/AddAuthenticator/v0001", "POST", postData);

            if (response == null)
            {
                return(LinkResult.GeneralFailure);
            }

            var addAuthenticatorResponse = JsonConvert.DeserializeObject <AddAuthenticatorResponse>(response);

            if (addAuthenticatorResponse == null || addAuthenticatorResponse.Response == null)
            {
                return(LinkResult.GeneralFailure);
            }

            if (addAuthenticatorResponse.Response.Status == 29)
            {
                return(LinkResult.AuthenticatorPresent);
            }

            if (addAuthenticatorResponse.Response.Status != 1)
            {
                return(LinkResult.GeneralFailure);
            }

            this.LinkedAccount     = addAuthenticatorResponse.Response;
            LinkedAccount.Session  = this._session;
            LinkedAccount.DeviceID = this.DeviceID;

            return(LinkResult.AwaitingFinalization);
        }
예제 #3
0
        private bool _hasPhoneAttached()
        {
            var postData = new NameValueCollection();

            postData.Add("op", "has_phone");
            postData.Add("arg", "null");
            string response         = SteamWeb.MobileLoginRequest(APIEndpoints.COMMUNITY_BASE + "/steamguard/phoneajax", "GET", postData, _cookies);
            var    hasPhoneResponse = JsonConvert.DeserializeObject <HasPhoneResponse>(response);

            return(hasPhoneResponse.HasPhone);
        }
예제 #4
0
        public LoginResult DoLogin()
        {
            var    postData = new NameValueCollection();
            var    cookies  = _cookies;
            string response = null;

            if (cookies.Count == 0)
            {
                //Generate a SessionID
                cookies.Add(new Cookie("mobileClientVersion", "0 (2.1.3)", "/", ".steamcommunity.com"));
                cookies.Add(new Cookie("mobileClient", "android", "/", ".steamcommunity.com"));
                cookies.Add(new Cookie("Steam_Language", "english", "/", ".steamcommunity.com"));

                NameValueCollection headers = new NameValueCollection();
                headers.Add("X-Requested-With", "com.valvesoftware.android.steam.community");

                SteamWeb.MobileLoginRequest("https://steamcommunity.com/login?oauth_client_id=DE45CD61&oauth_scope=read_profile%20write_profile%20read_client%20write_client", "GET", null, cookies, headers);
            }

            postData.Add("username", this.Username);
            response = SteamWeb.MobileLoginRequest(APIEndpoints.COMMUNITY_BASE + "/login/getrsakey", "POST", postData, cookies);
            if (response == null || response.Contains("<BODY>\nAn error occurred while processing your request."))
            {
                return(LoginResult.GeneralFailure);
            }

            var rsaResponse = JsonConvert.DeserializeObject <RSAResponse>(response);

            if (!rsaResponse.Success)
            {
                return(LoginResult.BadRSA);
            }

            RNGCryptoServiceProvider secureRandom = new RNGCryptoServiceProvider();

            byte[] encryptedPasswordBytes;
            using (var rsaEncryptor = new RSACryptoServiceProvider())
            {
                var passwordBytes = Encoding.ASCII.GetBytes(this.Password);
                var rsaParameters = rsaEncryptor.ExportParameters(false);
                rsaParameters.Exponent = Util.HexStringToByteArray(rsaResponse.Exponent);
                rsaParameters.Modulus  = Util.HexStringToByteArray(rsaResponse.Modulus);
                rsaEncryptor.ImportParameters(rsaParameters);
                encryptedPasswordBytes = rsaEncryptor.Encrypt(passwordBytes, false);
            }

            string encryptedPassword = Convert.ToBase64String(encryptedPasswordBytes);

            postData.Clear();
            postData.Add("username", this.Username);
            postData.Add("password", encryptedPassword);

            postData.Add("twofactorcode", this.TwoFactorCode ?? "");

            postData.Add("captchagid", this.RequiresCaptcha ? this.CaptchaGID : "-1");
            postData.Add("captcha_text", this.RequiresCaptcha ? this.CaptchaText : "");

            postData.Add("emailsteamid", (this.Requires2FA || this.RequiresEmail) ? this.SteamID.ToString() : "");
            postData.Add("emailauth", this.RequiresEmail ? this.EmailCode : "");

            postData.Add("rsatimestamp", rsaResponse.Timestamp);
            postData.Add("remember_login", "false");
            postData.Add("oauth_client_id", "DE45CD61");
            postData.Add("oauth_scope", "read_profile write_profile read_client write_client");
            postData.Add("loginfriendlyname", "#login_emailauth_friendlyname_mobile");
            postData.Add("donotcache", Util.GetSystemUnixTime().ToString());

            response = SteamWeb.MobileLoginRequest(APIEndpoints.COMMUNITY_BASE + "/login/dologin", "POST", postData, cookies);
            if (response == null)
            {
                return(LoginResult.GeneralFailure);
            }

            var loginResponse = JsonConvert.DeserializeObject <LoginResponse>(response);

            if (loginResponse.Message != null && loginResponse.Message.Contains("Incorrect login"))
            {
                return(LoginResult.BadCredentials);
            }

            if (loginResponse.CaptchaNeeded)
            {
                this.RequiresCaptcha = true;
                this.CaptchaGID      = loginResponse.CaptchaGID;
                return(LoginResult.NeedCaptcha);
            }

            if (loginResponse.EmailAuthNeeded)
            {
                this.RequiresEmail = true;
                this.SteamID       = loginResponse.EmailSteamID;
                return(LoginResult.NeedEmail);
            }

            if (loginResponse.TwoFactorNeeded && !loginResponse.Success)
            {
                this.Requires2FA = true;
                return(LoginResult.Need2FA);
            }

            if (loginResponse.Message != null && loginResponse.Message.Contains("too many login failures"))
            {
                return(LoginResult.TooManyFailedLogins);
            }

            if (loginResponse.OAuthData == null || loginResponse.OAuthData.OAuthToken == null || loginResponse.OAuthData.OAuthToken.Length == 0)
            {
                return(LoginResult.GeneralFailure);
            }

            if (!loginResponse.LoginComplete)
            {
                return(LoginResult.BadCredentials);
            }
            else
            {
                var readableCookies = cookies.GetCookies(new Uri("https://steamcommunity.com"));
                var oAuthData       = loginResponse.OAuthData;

                SessionData session = new SessionData();
                session.OAuthToken       = oAuthData.OAuthToken;
                session.SteamID          = oAuthData.SteamID;
                session.SteamLogin       = session.SteamID + "%7C%7C" + oAuthData.SteamLogin;
                session.SteamLoginSecure = session.SteamID + "%7C%7C" + oAuthData.SteamLoginSecure;
                session.WebCookie        = oAuthData.Webcookie;
                session.SessionID        = readableCookies["sessionid"].Value;
                this.Session             = session;
                this.LoggedIn            = true;
                return(LoginResult.LoginOkay);
            }

            return(LoginResult.GeneralFailure);
        }
예제 #5
0
        public FinalizeResult FinalizeAddAuthenticator(string smsCode)
        {
            //The act of checking the SMS code is necessary for Steam to finalize adding the phone number to the account.
            //Of course, we only want to check it if we're adding a phone number in the first place...

            if (!String.IsNullOrEmpty(this.PhoneNumber) && !this._checkSMSCode(smsCode))
            {
                return(FinalizeResult.BadSMSCode);
            }

            var postData = new NameValueCollection();

            postData.Add("steamid", _session.SteamID.ToString());
            postData.Add("access_token", _session.OAuthToken);
            postData.Add("activation_code", smsCode);
            int tries = 0;

            while (tries <= 30)
            {
                postData.Set("authenticator_code", LinkedAccount.GenerateSteamGuardCode());
                postData.Set("authenticator_time", TimeAligner.GetSteamTime().ToString());

                string response = SteamWeb.MobileLoginRequest(APIEndpoints.STEAMAPI_BASE + "/ITwoFactorService/FinalizeAddAuthenticator/v0001", "POST", postData);
                if (response == null)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                var finalizeResponse = JsonConvert.DeserializeObject <FinalizeAuthenticatorResponse>(response);

                if (finalizeResponse == null || finalizeResponse.Response == null)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                if (finalizeResponse.Response.Status == 89)
                {
                    return(FinalizeResult.BadSMSCode);
                }

                if (finalizeResponse.Response.Status == 88)
                {
                    if (tries >= 30)
                    {
                        return(FinalizeResult.UnableToGenerateCorrectCodes);
                    }
                }

                if (!finalizeResponse.Response.Success)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                if (finalizeResponse.Response.WantMore)
                {
                    tries++;
                    continue;
                }

                this.LinkedAccount.FullyEnrolled = true;
                return(FinalizeResult.Success);
            }

            return(FinalizeResult.GeneralFailure);
        }
예제 #6
0
        public FinalizeResult FinalizeAddAuthenticator(string smsCode)
        {
            bool smsCodeGood = false;

            var postData = new NameValueCollection();

            postData.Add("steamid", _session.SteamID.ToString());
            postData.Add("access_token", _session.OAuthToken);
            postData.Add("activation_code", smsCode);
            postData.Add("authenticator_code", "");
            int tries = 0;

            while (tries <= 30)
            {
                postData.Set("authenticator_code", tries == 0 ? "" : LinkedAccount.GenerateSteamGuardCode());
                postData.Add("authenticator_time", TimeAligner.GetSteamTime().ToString());

                if (smsCodeGood)
                {
                    postData.Set("activation_code", "");
                }

                string response = SteamWeb.MobileLoginRequest(APIEndpoints.STEAMAPI_BASE + "/ITwoFactorService/FinalizeAddAuthenticator/v0001", "POST", postData);
                if (response == null)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                var finalizeResponse = JsonConvert.DeserializeObject <FinalizeAuthenticatorResponse>(response);

                if (finalizeResponse == null || finalizeResponse.Response == null)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                if (finalizeResponse.Response.Status == 89)
                {
                    return(FinalizeResult.BadSMSCode);
                }

                if (finalizeResponse.Response.Status == 88)
                {
                    if (tries >= 30)
                    {
                        return(FinalizeResult.UnableToGenerateCorrectCodes);
                    }
                }

                if (!finalizeResponse.Response.Success)
                {
                    return(FinalizeResult.GeneralFailure);
                }

                if (finalizeResponse.Response.WantMore)
                {
                    smsCodeGood = true;
                    tries++;
                    continue;
                }

                this.LinkedAccount.FullyEnrolled = true;
                return(FinalizeResult.Success);
            }

            return(FinalizeResult.GeneralFailure);
        }