From 6f955c4b4d28dc800c38f10a33f9a18e09b83c51 Mon Sep 17 00:00:00 2001 From: Melvyn Depeyrot Date: Wed, 30 Sep 2020 15:09:30 -0700 Subject: [PATCH] WebAuth: Add oauth login functionality (#211) --- steam/webauth.py | 65 +++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 64 insertions(+), 1 deletion(-) diff --git a/steam/webauth.py b/steam/webauth.py index d81ce13d..1b2c8fc0 100644 --- a/steam/webauth.py +++ b/steam/webauth.py @@ -61,7 +61,6 @@ import six import requests -from steam import webapi from steam.steamid import SteamID from steam.utils.web import make_requests_session, generate_session_id from steam.core.crypto import rsa_publickey, pkcs1v15_encrypt @@ -323,6 +322,70 @@ def _finalize_login(self, login_response): self.steam_id = SteamID(data['steamid']) self.oauth_token = data['oauth_token'] + def oauth_login(self, oauth_token='', steam_id='', language='english'): + """Attempts a mobile authenticator login using an oauth token, which can be obtained from a previously logged-in + `MobileWebAuth` + + :param oauth_token: oauth token string, if it wasn't provided on instance init + :type oauth_token: :class:`str` + :param steam_id: `SteamID` of the account to log into, if it wasn't provided on instance init + :type steam_id: :class:`str` or :class:`SteamID` + :param language: select language for steam web pages (sets language cookie) + :type language: :class:`str` + :return: a session on success and :class:`None` otherwise + :rtype: :class:`requests.Session`, :class:`None` + :raises HTTPError: any problem with http request, timeouts, 5xx, 4xx etc + :raises LoginIncorrect: Invalid token or SteamID + """ + if oauth_token: + self.oauth_token = oauth_token + else: + if self.oauth_token: + oauth_token = self.oauth_token + else: + raise LoginIncorrect('token is not specified') + + if steam_id: + self.steam_id = SteamID(steam_id) + else: + if not self.steam_id: + raise LoginIncorrect('steam_id is not specified') + + steam_id = self.steam_id.as_64 + + data = { + 'access_token': oauth_token + } + + try: + resp = self.session.post('https://api.steampowered.com/IMobileAuthService/GetWGToken/v0001', data=data) + except requests.exceptions.RequestException as e: + raise HTTPError(str(e)) + + try: + resp_data = resp.json()['response'] + except json.decoder.JSONDecodeError as e: + if 'Please verify your
key=
parameter.' in resp.text: + raise LoginIncorrect('invalid token') + else: + raise e + + self.session_id = generate_session_id() + + for domain in ['store.steampowered.com', 'help.steampowered.com', 'steamcommunity.com']: + self.session.cookies.set('birthtime', '-3333', domain=domain) + self.session.cookies.set('sessionid', self.session_id, domain=domain) + self.session.cookies.set('mobileClientVersion', '0 (2.1.3)', domain=domain) + self.session.cookies.set('mobileClient', 'android', domain=domain) + self.session.cookies.set('steamLogin', str(steam_id) + "%7C%7C" + resp_data['token'], domain=domain) + self.session.cookies.set('steamLoginSecure', str(steam_id) + "%7C%7C" + resp_data['token_secure'], + domain=domain, secure=True) + self.session.cookies.set('Steam_Language', language, domain=domain) + + self.logged_on = True + + return self.session + class WebAuthException(Exception): pass