1
0
mirror of https://github.com/no2chem/wideq.git synced 2025-05-17 07:40:09 -07:00

Set up OAuth token refresh

This commit is contained in:
Adrian Sampson 2018-01-20 14:35:27 -05:00
parent 35a78281d6
commit ba3d423893

View File

@ -3,6 +3,9 @@ from urllib.parse import urljoin, urlencode, urlparse, parse_qs
import uuid import uuid
import base64 import base64
import json import json
import hashlib
import hmac
import datetime
GATEWAY_URL = 'https://kic.lgthinq.com:46030/api/common/gatewayUriList' GATEWAY_URL = 'https://kic.lgthinq.com:46030/api/common/gatewayUriList'
@ -13,12 +16,26 @@ COUNTRY = 'US'
LANGUAGE = 'en-US' LANGUAGE = 'en-US'
SVC_CODE = 'SVC202' SVC_CODE = 'SVC202'
CLIENT_ID = 'LGAO221A02' CLIENT_ID = 'LGAO221A02'
OAUTH_SECRET_KEY = b'c053c2a6ddeb7ad97cb0eed0dcb31cf8'
OAUTH_CLIENT_KEY = 'LGAO221A02'
EMP_APP_KEY = '3E57LJDGZ9F701O4844C3WPEAK7775NA'
DATE_FORMAT = '%a, %d %b %Y %H:%M:%S +0000'
def gen_uuid(): def gen_uuid():
return str(uuid.uuid4()) return str(uuid.uuid4())
def oauth2_signature(s, secret):
"""Get the base64-encoded SHA-1 HMAC digest of a string, as used in
OAauth2 request signatures.
"""
hashed = hmac.new(secret, s.encode('utf8'), hashlib.sha1)
digest = hashed.digest()
return base64.b64encode(digest)
class APIError(Exception): class APIError(Exception):
"""An error reported by the API.""" """An error reported by the API."""
@ -186,13 +203,37 @@ class Auth(object):
def refresh(self): def refresh(self):
token_url = urljoin(self.gateway.oauth_root, '/oauth2/token') token_url = urljoin(self.gateway.oauth_root, '/oauth2/token')
query = urlencode({ data = {
'grant_type': 'refresh_token', 'grant_type': 'refresh_token',
'refresh_token': self.refresh_token, 'refresh_token': self.refresh_token,
}) }
req_url = '{}?{}'.format(token_url, query) query = urlencode(data)
requests.Request('GET', req_url) # The timestamp for labeling OAuth requests can be obtained
# through a request to the date/time endpoint:
# https://us.lgeapi.com/datetime
# But we can also just generate a timestamp.
timestamp = datetime.datetime.utcnow().strftime(DATE_FORMAT)
# The signature for the requests is on a GET-like version of the
# request URL, followed by a newline and a timestamp.
req_url = '{}?{}'.format(token_url, query)
sig = oauth2_signature('{}\n{}'.format(req_url, timestamp),
OAUTH_SECRET_KEY)
headers = {
'X-Device-Type': 'A04',
'X-Device-Platform': 'ADR',
'X-Lge-Svccode': SVC_CODE,
'X-Application-Key': EMP_APP_KEY,
'lgemp-x-app-key': OAUTH_CLIENT_KEY,
'lgemp-x-signature': sig,
'lgemp-x-date': timestamp,
'Accept': 'application/json',
}
res = requests.post(token_url, data=data, headers=headers)
print(res.text)
class Session(object): class Session(object):