2026-01-22 16:17:05 +01:00
|
|
|
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:
|
2026-02-06 17:42:40 +01:00
|
|
|
self.session.headers.pop("x-requested-with", None)
|
|
|
|
|
self.session.headers.pop("x-inertia", None)
|
|
|
|
|
self.session.headers.pop("x-inertia-version", None)
|
2026-01-22 16:17:05 +01:00
|
|
|
|
|
|
|
|
csrf_token = extract_html_value(
|
2026-02-06 17:42:40 +01:00
|
|
|
self.redirect_response.text, r'name="csrf_token" value="([^"]+)"'
|
2026-01-22 16:17:05 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
response = self.session.post(
|
2026-02-06 17:42:40 +01:00
|
|
|
"https://idp.scc.kit.edu/idp/profile/SAML2/Redirect/SSO?execution=e1s1",
|
2026-01-22 16:17:05 +01:00
|
|
|
data={
|
2026-02-06 17:42:40 +01:00
|
|
|
"csrf_token": csrf_token,
|
|
|
|
|
"j_username": self.username,
|
|
|
|
|
"j_password": self.password,
|
|
|
|
|
"_eventId_proceed": "",
|
|
|
|
|
"fudis_web_authn_assertion_input": "",
|
|
|
|
|
},
|
2026-01-22 16:17:05 +01:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
if "/consume" not in html.unescape(response.text):
|
2026-02-06 17:42:40 +01:00
|
|
|
raise ValueError(
|
|
|
|
|
"KIT authentication failed - invalid credentials or SSO error"
|
|
|
|
|
)
|
2026-01-22 16:17:05 +01:00
|
|
|
|
|
|
|
|
return response.text
|