import html
from auth.providers.base import SSOProvider
from utils.helpers import extract_html_value
class KITProvider(SSOProvider):
"""SSO provider for Karlsruhe Institute of Technology (KIT)."""
name = "KIT"
domain = "kit.edu"
def authenticate(self) -> str:
self.session.headers.pop("x-requested-with", None)
self.session.headers.pop("x-inertia", None)
self.session.headers.pop("x-inertia-version", None)
csrf_token = extract_html_value(
self.redirect_response.text, r'name="csrf_token" value="([^"]+)"'
)
response = self.session.post(
"https://idp.scc.kit.edu/idp/profile/SAML2/Redirect/SSO?execution=e1s1",
data={
"csrf_token": csrf_token,
"j_username": self.username,
"j_password": self.password,
"_eventId_proceed": "",
"fudis_web_authn_assertion_input": "",
},
)
if "/consume" not in html.unescape(response.text):
raise ValueError(
"KIT authentication failed - invalid credentials or SSO error"
)
return response.text