1+ import logging
12import requests
23import time
34from authlib .jose import JsonWebToken
78from flask import current_app , g
89from config import Config
910
11+ logger = logging .getLogger (__name__ )
12+
13+
14+ def realm_base_url (server_url : str , realm : str ) -> str :
15+ """Build Keycloak realm base URL, normalizing server_url with or without trailing slash."""
16+ return f"{ server_url .rstrip ('/' )} /realms/{ realm } "
17+
18+
1019def OIDCDiscovery (base_url ):
1120 conf = Config ()
1221
1322 # Fetch the openid metadata so we may know the jwk endpoint uri
1423 server_metadata_url = f"{ base_url } /.well-known/openid-configuration"
24+ logger .info (f"Fetching OIDC metadata from: { server_metadata_url } " )
1525 server_metadata_r = requests .get (server_metadata_url )
1626 if server_metadata_r .status_code != 200 :
1727 raise Exception (
18- f"Error getting auth server metadata from url: { server_metadata_url } "
19- + ", status_code: {server_metadata_r.status_code}"
28+ f"Error getting auth server metadata from url: { server_metadata_url } , "
29+ f"status_code: { server_metadata_r .status_code } , "
30+ f"response: { server_metadata_r .text [:500 ]} "
2031 )
2132 server_metadata = server_metadata_r .json ()
33+ logger .info (f"OIDC discovery succeeded. jwks_uri: { server_metadata .get ('jwks_uri' )} " )
2234 return server_metadata
2335
2436class OIDCTokenValidator (BearerTokenValidator ):
@@ -31,20 +43,23 @@ def __init__(self, token_cls, realm=None):
3143
3244 server_url = conf .data ['keycloak' ]['serverUrl' ]
3345 realm = conf .data ['keycloak' ]['realm' ]
34- baseUrl = "%srealms/%s" % (server_url , realm )
35-
46+ baseUrl = realm_base_url (server_url , realm )
3647 self .aud = conf .data ['tokenMatch' ]['aud' ]
3748
3849 server_metadata = OIDCDiscovery (baseUrl )
3950
4051 # Fetch the public key for validating Bearer token
41- jwk_r = requests .get (server_metadata ['jwks_uri' ])
52+ jwks_uri = server_metadata ['jwks_uri' ]
53+ logger .info (f"Fetching JWK from: { jwks_uri } " )
54+ jwk_r = requests .get (jwks_uri )
4255 if jwk_r .status_code != 200 :
4356 raise Exception (
44- f"Error getting jwk from url: { server_metadata ['jwks_uri' ]} "
45- + ", status_code: {jwk_r.status_code}"
57+ f"Error getting jwk from url: { jwks_uri } , "
58+ f"status_code: { jwk_r .status_code } , "
59+ f"response: { jwk_r .text [:500 ]} "
4660 )
4761 self .jwk = jwk_r .json ()
62+ logger .info ("JWK fetched successfully" )
4863
4964 def authenticate_token (self , token_string ):
5065 jwt = JsonWebToken (['RS256' ])
0 commit comments