1- from django .conf import settings
2- from sampleAppOAuth2 .models import Bearer
3- from datetime import datetime
4- import urllib
51import requests
62import base64
73import json
84import random
9- from jose import jws , jwk
10- from base64 import urlsafe_b64decode , b64decode
5+
6+ from jose import jwk
7+ from datetime import datetime
8+
9+ from django .conf import settings
10+
1111from sampleAppOAuth2 import getDiscoveryDocument
12+ from sampleAppOAuth2 .models import Bearer
13+
1214
1315# token can either be an accessToken or a refreshToken
1416def revokeToken (token ):
15- revoke_endpoint = getDiscoveryDocument .revoke_endpoint
17+ revoke_endpoint = getDiscoveryDocument .revoke_endpoint
1618 auth_header = 'Basic ' + stringToBase64 (settings .CLIENT_ID + ':' + settings .CLIENT_SECRET )
17- headers = {'Accept' : 'application/json' , 'content-type' : 'application/json' , 'Authorization' : auth_header }
18- payload = { 'token' : token }
19+ headers = {'Accept' : 'application/json' , 'content-type' : 'application/json' , 'Authorization' : auth_header }
20+ payload = {'token' : token }
1921 r = requests .post (revoke_endpoint , json = payload , headers = headers )
20-
22+
2123 if r .status_code >= 500 :
2224 return 'internal_server_error'
2325 elif r .status_code >= 400 :
2426 return 'Token is incorrect.'
2527 else :
2628 return 'Revoke successful'
2729
30+
2831def getBearerToken (auth_code ):
2932 token_endpoint = getDiscoveryDocument .token_endpoint
3033 auth_header = 'Basic ' + stringToBase64 (settings .CLIENT_ID + ':' + settings .CLIENT_SECRET )
31- headers = {'Accept' : 'application/json' , 'content-type' : 'application/x-www-form-urlencoded' , 'Authorization' : auth_header }
34+ headers = {'Accept' : 'application/json' , 'content-type' : 'application/x-www-form-urlencoded' ,
35+ 'Authorization' : auth_header }
3236 payload = {
33- 'code' : auth_code ,
34- 'redirect_uri' : settings .REDIRECT_URI ,
35- 'grant_type' : 'authorization_code'
37+ 'code' : auth_code ,
38+ 'redirect_uri' : settings .REDIRECT_URI ,
39+ 'grant_type' : 'authorization_code'
3640 }
3741 r = requests .post (token_endpoint , data = payload , headers = headers )
3842 if r .status_code != 200 :
3943 return r .text
4044 bearer_raw = json .loads (r .text )
4145
4246 if 'id_token' in bearer_raw :
43- idToken = idToken = bearer_raw ['id_token' ]
47+ idToken = bearer_raw ['id_token' ]
4448 else :
4549 idToken = None
46-
47- return Bearer (bearer_raw ['x_refresh_token_expires_in' ],bearer_raw ['access_token' ],bearer_raw ['token_type' ], bearer_raw ['refresh_token' ], bearer_raw ['expires_in' ], idToken = idToken )
50+
51+ return Bearer (bearer_raw ['x_refresh_token_expires_in' ], bearer_raw ['access_token' ], bearer_raw ['token_type' ],
52+ bearer_raw ['refresh_token' ], bearer_raw ['expires_in' ], idToken = idToken )
53+
4854
4955def getBearerTokenFromRefreshToken (refresh_Token ):
5056 token_endpoint = getDiscoveryDocument .token_endpoint
5157 auth_header = 'Basic ' + stringToBase64 (settings .CLIENT_ID + ':' + settings .CLIENT_SECRET )
52- headers = {'Accept' : 'application/json' , 'content-type' : 'application/x-www-form-urlencoded' , 'Authorization' : auth_header }
58+ headers = {'Accept' : 'application/json' , 'content-type' : 'application/x-www-form-urlencoded' ,
59+ 'Authorization' : auth_header }
5360 payload = {
54- 'refresh_token' : refresh_Token ,
55- 'grant_type' : 'refresh_token'
61+ 'refresh_token' : refresh_Token ,
62+ 'grant_type' : 'refresh_token'
5663 }
5764 r = requests .post (token_endpoint , data = payload , headers = headers )
5865 bearer_raw = json .loads (r .text )
5966
6067 if 'id_token' in bearer_raw :
61- idToken = idToken = bearer_raw ['id_token' ]
68+ idToken = bearer_raw ['id_token' ]
6269 else :
6370 idToken = None
64-
65- return Bearer (bearer_raw ['x_refresh_token_expires_in' ],bearer_raw ['access_token' ],bearer_raw ['token_type' ], bearer_raw ['refresh_token' ], bearer_raw ['expires_in' ], idToken = idToken )
71+
72+ return Bearer (bearer_raw ['x_refresh_token_expires_in' ], bearer_raw ['access_token' ], bearer_raw ['token_type' ],
73+ bearer_raw ['refresh_token' ], bearer_raw ['expires_in' ], idToken = idToken )
74+
6675
6776def getUserProfile (access_token ):
6877 auth_header = 'Bearer ' + access_token
69- headers = {'Accept' : 'application/json' , 'Authorization' : auth_header ,
70- 'accept' : 'application/json' }
78+ headers = {'Accept' : 'application/json' , 'Authorization' : auth_header , 'accept' : 'application/json' }
7179 r = requests .get (settings .SANDBOX_PROFILE_URL , headers = headers )
7280 status_code = r .status_code
7381 response = json .loads (r .text )
7482 return response , status_code
7583
84+
7685def getCompanyInfo (access_token , realmId ):
7786 route = '/v3/company/{0}/companyinfo/{0}' .format (realmId )
7887 auth_header = 'Bearer ' + access_token
79- headers = {'Authorization' : auth_header ,
80- 'accept' : 'application/json' }
88+ headers = {'Authorization' : auth_header , 'accept' : 'application/json' }
8189 r = requests .get (settings .SANDBOX_QBO_BASEURL + route , headers = headers )
8290 status_code = r .status_code
8391 response = json .loads (r .text )
8492 return response , status_code
8593
86- """
87- The validation steps can be found at ours docs at developer.intuit.com
88- """
94+
95+ # The validation steps can be found at ours docs at developer.intuit.com
8996def validateJWTToken (token ):
90- is_valid = True
9197 current_time = (datetime .utcnow () - datetime (1970 , 1 , 1 )).total_seconds ()
9298 token_parts = token .split ('.' )
9399 idTokenHeader = json .loads (base64 .b64decode (token_parts [0 ]).decode ('ascii' ))
94100 idTokenPayload = json .loads (base64 .b64decode (incorrect_padding (token_parts [1 ])).decode ('ascii' ))
95-
101+
96102 if idTokenPayload ['iss' ] != settings .ID_TOKEN_ISSUER :
97103 return False
98104 elif idTokenPayload ['aud' ][0 ] != settings .CLIENT_ID :
99105 return False
100106 elif idTokenPayload ['exp' ] < current_time :
101107 return False
102-
103- token = token .encode ()
108+
109+ token = token .encode ()
104110 token_to_verify = token .decode ("ascii" ).split ('.' )
105- message = token_to_verify [0 ]+ '.' + token_to_verify [1 ]
111+ message = token_to_verify [0 ] + '.' + token_to_verify [1 ]
106112 idTokenSignature = base64 .urlsafe_b64decode (incorrect_padding (token_to_verify [2 ]))
107113
108114 keys = getKeyFromJWKUrl (idTokenHeader ['kid' ])
109115
110116 publicKey = jwk .construct (keys )
111117 return publicKey .verify (message .encode ('utf-8' ), idTokenSignature )
112118
119+
113120def getKeyFromJWKUrl (kid ):
114121 jwk_uri = getDiscoveryDocument .jwks_uri
115122 r = requests .get (jwk_uri )
116123 if r .status_code >= 400 :
117124 return ''
118125 data = json .loads (r .text )
119-
120- key = next (ele for ele in data ["keys" ] if ele ['kid' ]== kid )
126+
127+ key = next (ele for ele in data ["keys" ] if ele ['kid' ] == kid )
121128 return key
122129
130+
123131# for decoding ID Token
124132def incorrect_padding (s ):
125- return (s + '=' * (4 - len (s ) % 4 ))
133+ return s + '=' * (4 - len (s ) % 4 )
134+
126135
127136def stringToBase64 (s ):
128- return base64 .b64encode (bytes (s ,'utf-8' )).decode ()
129-
130- """
131- Returns a securely generated random string.
132- Source from the django.utils.crypto module.
133- """
134- def getRandomString (length ,
135- allowed_chars = 'abcdefghijklmnopqrstuvwxyz'
136- 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ):
137+ return base64 .b64encode (bytes (s , 'utf-8' )).decode ()
138+
139+
140+ # Returns a securely generated random string. Source from the django.utils.crypto module.
141+ def getRandomString (length , allowed_chars = 'abcdefghijklmnopqrstuvwxyz' 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789' ):
137142 return '' .join (random .choice (allowed_chars ) for i in range (length ))
138143
139- """
140- Create a random secret key.
141- Source from the django.utils.crypto module.
142- """
144+
145+ # Create a random secret key. Source from the django.utils.crypto module.
143146def getSecretKey ():
144147 chars = 'abcdefghijklmnopqrstuvwxyz0123456789'
145- return getRandomString (40 , chars )
148+ return getRandomString (40 , chars )
0 commit comments