def make_token_post(server, data): """Try getting an access token from the server. If successful, returns the JSON response. If unsuccessful, raises an OAuthException. """ try: response = requests.post(server + TOKEN_ENDPOINT, data=data, timeout=TIMEOUT) body = response.json() except Exception as e: log.warning('Other error when exchanging code', exc_info=True) raise OAuthException( error='Authentication Failed', error_description=str(e)) if 'error' in body: raise OAuthException( error=body.get('error', 'Unknown Error'), error_description = body.get('error_description', '')) return body
def do_GET(self): """Respond to the GET request made by the OAuth""" nonlocal code_response, oauth_exception log.debug('Received GET request for %s', self.path) path = urlparse(self.path) qs = {k: v for k, v in parse_qsl(path.query)} code = qs.get('code') if code: try: code_response = make_code_post(server, code, redirect_uri) except OAuthException as e: oauth_exception = e else: oauth_exception = OAuthException( error=qs.get('error', 'Unknown Error'), error_description=qs.get('error_description', '')) if oauth_exception: self.send_failure(oauth_exception) else: self.send_redirect('{}/{}'.format(server, endpoint))