11import hashlib
22import time
33from base64 import urlsafe_b64encode
4+
45import 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
1010CLIENT_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 )
0 commit comments