Skip to content

Commit bb2097b

Browse files
authored
WebAuth: Add oauth login functionality (ValvePython#211)
1 parent 6209db9 commit bb2097b

1 file changed

Lines changed: 64 additions & 1 deletion

File tree

steam/webauth.py

Lines changed: 64 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,6 @@
6161
import six
6262
import requests
6363

64-
from steam import webapi
6564
from steam.steamid import SteamID
6665
from steam.utils.web import make_requests_session, generate_session_id
6766
from steam.core.crypto import rsa_publickey, pkcs1v15_encrypt
@@ -323,6 +322,70 @@ def _finalize_login(self, login_response):
323322
self.steam_id = SteamID(data['steamid'])
324323
self.oauth_token = data['oauth_token']
325324

325+
def oauth_login(self, oauth_token='', steam_id='', language='english'):
326+
"""Attempts a mobile authenticator login using an oauth token, which can be obtained from a previously logged-in
327+
`MobileWebAuth`
328+
329+
:param oauth_token: oauth token string, if it wasn't provided on instance init
330+
:type oauth_token: :class:`str`
331+
:param steam_id: `SteamID` of the account to log into, if it wasn't provided on instance init
332+
:type steam_id: :class:`str` or :class:`SteamID`
333+
:param language: select language for steam web pages (sets language cookie)
334+
:type language: :class:`str`
335+
:return: a session on success and :class:`None` otherwise
336+
:rtype: :class:`requests.Session`, :class:`None`
337+
:raises HTTPError: any problem with http request, timeouts, 5xx, 4xx etc
338+
:raises LoginIncorrect: Invalid token or SteamID
339+
"""
340+
if oauth_token:
341+
self.oauth_token = oauth_token
342+
else:
343+
if self.oauth_token:
344+
oauth_token = self.oauth_token
345+
else:
346+
raise LoginIncorrect('token is not specified')
347+
348+
if steam_id:
349+
self.steam_id = SteamID(steam_id)
350+
else:
351+
if not self.steam_id:
352+
raise LoginIncorrect('steam_id is not specified')
353+
354+
steam_id = self.steam_id.as_64
355+
356+
data = {
357+
'access_token': oauth_token
358+
}
359+
360+
try:
361+
resp = self.session.post('https://api.steampowered.com/IMobileAuthService/GetWGToken/v0001', data=data)
362+
except requests.exceptions.RequestException as e:
363+
raise HTTPError(str(e))
364+
365+
try:
366+
resp_data = resp.json()['response']
367+
except json.decoder.JSONDecodeError as e:
368+
if 'Please verify your <pre>key=</pre> parameter.' in resp.text:
369+
raise LoginIncorrect('invalid token')
370+
else:
371+
raise e
372+
373+
self.session_id = generate_session_id()
374+
375+
for domain in ['store.steampowered.com', 'help.steampowered.com', 'steamcommunity.com']:
376+
self.session.cookies.set('birthtime', '-3333', domain=domain)
377+
self.session.cookies.set('sessionid', self.session_id, domain=domain)
378+
self.session.cookies.set('mobileClientVersion', '0 (2.1.3)', domain=domain)
379+
self.session.cookies.set('mobileClient', 'android', domain=domain)
380+
self.session.cookies.set('steamLogin', str(steam_id) + "%7C%7C" + resp_data['token'], domain=domain)
381+
self.session.cookies.set('steamLoginSecure', str(steam_id) + "%7C%7C" + resp_data['token_secure'],
382+
domain=domain, secure=True)
383+
self.session.cookies.set('Steam_Language', language, domain=domain)
384+
385+
self.logged_on = True
386+
387+
return self.session
388+
326389

327390
class WebAuthException(Exception):
328391
pass

0 commit comments

Comments
 (0)