44import uuid
55from time import time
66from urllib .parse import parse_qs , urlparse
7+ from html .parser import HTMLParser
78
89import jwt
910import requests
10- from lxml import html
1111
1212from .credentials import get_credentials
1313from .dot_proxygen import token_cache_file
1414
1515
16+ class KeycloakFormParser (HTMLParser ):
17+ action = None
18+
19+ def handle_starttag (self , tag , attrs ):
20+ if tag != 'form' :
21+ return
22+
23+ attributes = dict (attrs )
24+
25+ if attributes .get ('id' ) != "kc-form-login" :
26+ return
27+
28+ self .action = attributes .get ('action' )
29+
30+
1631def cache_key ():
1732 s = get_credentials ().json ()
1833 return hashlib .md5 (s .encode ("utf-8" )).hexdigest ()
@@ -106,11 +121,10 @@ def _get_token_data_from_user_login():
106121 f"Login page get request status was { login_page_resp .status_code } expected to be 200"
107122 )
108123
109- login_form = html . fromstring ( login_page_resp . content . decode ()). get_element_by_id (
110- "kc-form-login"
111- )
124+ parser = KeycloakFormParser ()
125+ parser . feed ( login_page_resp . content . decode ())
126+ url = parser . action
112127
113- url = login_form .action
114128 user_login_resp = session .post (
115129 url ,
116130 headers = {
@@ -180,4 +194,4 @@ def _get_token_data_from_machine_user():
180194 raise RuntimeError (
181195 f"Token response was { token_response .status_code } expected 200"
182196 )
183- return token_response .json ()
197+ return token_response .json ()
0 commit comments