Skip to content

Commit 068aa5d

Browse files
committed
fixed compute
1 parent 806fa78 commit 068aa5d

File tree

2 files changed

+44
-79
lines changed

2 files changed

+44
-79
lines changed

gbmapi/auth.py

Lines changed: 36 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,22 @@
11
import hashlib
22
import time
33
from base64 import urlsafe_b64encode
4+
45
import pyotp
5-
import requests
66

7-
from .exceptions import ResponseError
8-
from .utils import generate_secure_base64_string, STANDARD_HEADERS, load_jwt
7+
from .base import GBMApiBase
8+
from .utils import generate_secure_base64_string, load_jwt
99

1010
CLIENT_ID = "7c464570619a417080b300076e163289"
1111

1212

13-
class GBMAuth:
14-
AUTH_URL = "https://auth.gbm.com"
13+
class GBMAuth(GBMApiBase):
14+
API_URL = "https://auth.gbm.com"
1515
ORIGIN = 'https://app.gbm.com'
1616

17-
def __init__(self, user, password, secret, device, latitude, longitude, device_mac_address, client_id=CLIENT_ID):
17+
def __init__(self, user, password, secret, device, latitude, longitude, device_mac_address,
18+
client_id=CLIENT_ID):
19+
1820
self.client_id = client_id
1921
self.user = user
2022
self.password = password
@@ -25,6 +27,8 @@ def __init__(self, user, password, secret, device, latitude, longitude, device_m
2527
self.device_mac_address = device_mac_address
2628
self._credentials = None
2729

30+
super().__init__(self)
31+
2832
@property
2933
def credentials(self):
3034
return self._credentials
@@ -33,64 +37,31 @@ def credentials(self):
3337
def credentials(self, value):
3438
self._credentials = value
3539

36-
def check_credentials(self):
40+
def load_credentials(self):
3741
cred = self.credentials
3842
if cred is None:
39-
self.login()
40-
cred = self.credentials
43+
cred = self.login()
44+
self.credentials = cred
4145
else:
4246
_, b, _ = load_jwt(cred['accessToken'])
4347
if b['exp'] + 60 <= time.time():
44-
self.refresh()
45-
cred = self.credentials
48+
cred = self.refresh()
49+
self.credentials = cred
4650

4751
return cred
4852

4953
def access_token(self):
50-
cred = self.check_credentials()
54+
cred = self.load_credentials()
5155
return cred['tokenType'] + ' ' + cred['accessToken']
5256

5357
def identity_token(self):
54-
cred = self.check_credentials()
58+
cred = self.load_credentials()
5559
return cred['identityToken']
5660

57-
def _request(self, method, path, headers=None, json=None, check_success=True):
58-
resp = requests.request(
59-
method,
60-
self.AUTH_URL + path,
61-
headers={
62-
**STANDARD_HEADERS,
63-
'origin': self.ORIGIN,
64-
**(headers if headers else {})
65-
},
66-
json=json
67-
)
68-
if resp.status_code != 200:
69-
if resp.status_code == 401:
70-
self.credentials = None
71-
raise ResponseError(resp)
72-
73-
resp = resp.json()
74-
if check_success:
75-
assert resp['code'] == 0, resp
76-
assert resp['id'] == "Success", resp
77-
assert resp['message'] == "Exitoso", resp
78-
return resp
79-
80-
def _auth_request(self, method, path, json=None):
81-
return self._request(
82-
method,
83-
path,
84-
headers={
85-
'authorization': self.access_token()
86-
},
87-
json=json
88-
)
89-
9061
def client(self):
9162
resp = self._request(
92-
method="GET",
9363
path=f"/api/v1/clients/{self.client_id}",
64+
authenticate=False
9465
)
9566
return resp
9667

@@ -100,7 +71,7 @@ def login(self):
10071
'device-latitude': self.latitude,
10172
'device-longitude': self.longitude,
10273
'device-mac-address': self.device_mac_address,
103-
'origin': GBMAuth.AUTH_URL
74+
'origin': GBMAuth.API_URL
10475
}
10576

10677
# Create a code verifier and challenge
@@ -110,8 +81,8 @@ def login(self):
11081
code_challenge = urlsafe_b64encode(m.digest()).decode().rstrip("=")
11182

11283
resp = self._request(
113-
method="POST",
11484
path="/api/v1/session/user",
85+
authenticate=False,
11586
headers=device_headers,
11687
json={
11788
"clientId": self.client_id,
@@ -130,8 +101,8 @@ def login(self):
130101
otp = totp.now()
131102

132103
resp = self._request(
133-
method="POST",
134104
path="/api/v1/session/user/challenge",
105+
authenticate=False,
135106
headers=device_headers,
136107
json={
137108
"challengeType": resp['challengeType'],
@@ -143,68 +114,65 @@ def login(self):
143114
"responseType": "code",
144115
"codeChallenge": code_challenge,
145116
"codeChallengeMethod": "SHA256"
146-
}
117+
},
118+
check_success=True
147119
)
148120

149121
resp = self._request(
150-
method="POST",
151122
path="/api/v1/session/token",
123+
authenticate=False,
152124
json={
153125
"clientId": self.client_id,
154126
"codeVerifier": code_verifier,
155127
"code": resp['authorizationCode']
156-
}
128+
},
129+
check_success=True
157130
)
158-
self.credentials = resp
131+
return resp
159132

160133
def refresh(self):
161-
cred = self.credentials
162-
refresh_token = cred['refreshToken']
134+
refresh_token = self.credentials['refreshToken']
163135

164136
resp = self._request(
165-
method="POST",
166137
path="/api/v1/session/user/refresh",
138+
authenticate=False,
167139
json={
168140
"clientId": self.client_id,
169141
"refreshToken": refresh_token
170142
}
171143
)
172144
resp['refreshToken'] = refresh_token
173-
self.credentials = resp
145+
return resp
174146

175147
# After Authenticated
176148
def logout(self):
177149
# Clear Session Token
178-
self._auth_request(
179-
"DELETE",
150+
self._request(
180151
path=f"/api/v1/session/user?client_id={self.client_id}",
152+
method="DELETE"
181153
)
182154
self.credentials = None
183155

184156
def security_settings(self):
185157
"""Returns the security settings of the user"""
186-
return self._auth_request(
187-
"GET",
158+
return self._request(
188159
path="/api/v1/security-settings"
189160
)
190161

191162
def login_history(self):
192163
"""Returns the login history of the user"""
193-
return self._auth_request(
194-
"GET",
164+
return self._request(
195165
path="/api/v1/security-settings/login-history"
196166
)
197167

198168
def challenge(self):
199169
"""Returns information about the challenge."""
200-
return self._auth_request(
201-
method="GET",
170+
return self._request(
202171
path="/api/v1/challenge"
203172
)
204173

205174
def token(self):
206175
"""Returns information about the token."""
207-
return self._auth_request(
208-
method="GET",
176+
return self._request(
209177
path="/api/v1/token"
210178
)

gbmapi/base.py

Lines changed: 8 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
import requests
22

3-
from . import GBMAuth
43
from .exceptions import ResponseError
54
from .utils import STANDARD_HEADERS
65

@@ -9,30 +8,28 @@ class GBMApiBase:
98
API_URL = None # "https://api.gbm.com"
109
ORIGIN = None # "https://homebroker.gbm.com"
1110

12-
def __init__(self, auth: GBMAuth):
11+
def __init__(self, auth):
1312
self.auth = auth
1413

15-
def _request(self, path, headers=None, json=None):
14+
def _request(self, path, method=None, headers=None, json=None, check_success=False, authenticate=True):
1615
resp = requests.request(
17-
"GET" if json is None else "POST",
16+
method if method else ("GET" if json is None else "POST"),
1817
self.API_URL + path,
1918
headers={
2019
**STANDARD_HEADERS,
21-
'authorization': self.auth.access_token(),
20+
**({'authorization': self.auth.access_token()} if authenticate else {}),
2221
'origin': self.ORIGIN,
2322
**(headers if headers else {})
2423
},
2524
json=json
2625
)
2726

2827
if resp.status_code != 200:
29-
if resp.status_code == 401:
30-
self.auth.credentials = None
31-
3228
raise ResponseError(resp)
3329

3430
resp = resp.json()
35-
# assert resp['code'] == 0, resp
36-
# assert resp['id'] == "Success", resp
37-
# assert resp['message'] == "Exitoso", resp
31+
if check_success:
32+
assert resp['code'] == 0, resp
33+
assert resp['id'] == "Success", resp
34+
assert resp['message'] == "Exitoso", resp
3835
return resp

0 commit comments

Comments
 (0)