diff --git a/admin/integrations.php b/admin/integrations.php index 23dde39..2da737f 100644 --- a/admin/integrations.php +++ b/admin/integrations.php @@ -32,6 +32,14 @@ if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['save'])) { $db->setSetting('twilio_sid', trim($_POST['twilio_sid'] ?? '')); $db->setSetting('twilio_from', trim($_POST['twilio_from'] ?? '')); if (!empty($_POST['twilio_token'])) { $db->setSetting('twilio_token', trim($_POST['twilio_token'])); } + $db->setSetting('oidc_enabled', isset($_POST['oidc_enabled']) ? '1' : '0'); + $db->setSetting('oidc_name', trim($_POST['oidc_name'] ?? 'SSO')); + $db->setSetting('oidc_client_id', trim($_POST['oidc_client_id'] ?? '')); + $db->setSetting('oidc_auth_url', trim($_POST['oidc_auth_url'] ?? '')); + $db->setSetting('oidc_token_url', trim($_POST['oidc_token_url'] ?? '')); + $db->setSetting('oidc_userinfo_url', trim($_POST['oidc_userinfo_url'] ?? '')); + $db->setSetting('oidc_scopes', trim($_POST['oidc_scopes'] ?? 'openid profile email')); + if (!empty($_POST['oidc_client_secret'])) { $db->setSetting('oidc_client_secret', trim($_POST['oidc_client_secret'])); } $db->setSetting('user_daily_voucher_limit', max(0, (int)($_POST['user_daily_voucher_limit'] ?? 0))); $db->setSetting('trusted_proxy', trim($_POST['trusted_proxy'] ?? '')); $db->setSetting('webhook_enabled', isset($_POST['webhook_enabled']) ? '1' : '0'); @@ -57,6 +65,14 @@ $smsEnabled = $db->getSetting('sms_enabled', '0') === '1'; $twilioSid = $db->getSetting('twilio_sid', ''); $twilioFrom = $db->getSetting('twilio_from', ''); $twilioTokenSet = $db->getSetting('twilio_token', '') !== ''; +$oidcEnabled = $db->getSetting('oidc_enabled', '0') === '1'; +$oidcName = $db->getSetting('oidc_name', 'SSO'); +$oidcClientId = $db->getSetting('oidc_client_id', ''); +$oidcAuthUrl = $db->getSetting('oidc_auth_url', ''); +$oidcTokenUrl = $db->getSetting('oidc_token_url', ''); +$oidcUserinfoUrl = $db->getSetting('oidc_userinfo_url', ''); +$oidcScopes = $db->getSetting('oidc_scopes', 'openid profile email'); +$oidcSecretSet = $db->getSetting('oidc_client_secret', '') !== ''; $dailyLimit = (int)$db->getSetting('user_daily_voucher_limit', 0); $trustedProxy = $db->getSetting('trusted_proxy', ''); $webhookEnabled = $db->getSetting('webhook_enabled', '0') === '1'; @@ -145,6 +161,21 @@ label { display:block; font-size:14px; color:var(--text-secondary); margin:14px +
Generischer OIDC-Provider (z.B. Keycloak, Authentik, Google, Auth0). Redirect-URI: = htmlspecialchars(((!empty($_SERVER['HTTPS'])&&$_SERVER['HTTPS']!=='off')?'https':'http').'://'.$_SERVER['HTTP_HOST'].rtrim(dirname($_SERVER['SCRIPT_NAME']),'/').'/../oidc_callback.php') ?>
Aufbewahrungsfristen in Tagen (0 = deaktiviert). Ausführung per cron_cleanup.php (täglich empfohlen).
diff --git a/login.php b/login.php
index 341b1b6..1530eef 100644
--- a/login.php
+++ b/login.php
@@ -94,6 +94,27 @@ try {
$m365LoginUrl = "https://login.microsoftonline.com/$m365TenantId/oauth2/v2.0/authorize?" . http_build_query($params);
}
+ // Generisches OIDC (optional)
+ $oidcEnabled = $db->getSetting('oidc_enabled', '0') === '1'
+ && $db->getSetting('oidc_client_id', '') !== ''
+ && $db->getSetting('oidc_auth_url', '') !== '';
+ $oidcName = $db->getSetting('oidc_name', 'SSO');
+ $oidcLoginUrl = '';
+ if ($oidcEnabled) {
+ $protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https' : 'http';
+ $scriptPath = dirname($_SERVER['SCRIPT_NAME']);
+ $scriptPath = $scriptPath === '/' ? '' : $scriptPath;
+ $oidcState = bin2hex(random_bytes(16));
+ $_SESSION['oidc_state'] = $oidcState;
+ $oidcLoginUrl = rtrim($db->getSetting('oidc_auth_url', ''), '?') . '?' . http_build_query([
+ 'client_id' => $db->getSetting('oidc_client_id', ''),
+ 'response_type' => 'code',
+ 'redirect_uri' => $protocol . '://' . $_SERVER['HTTP_HOST'] . $scriptPath . '/oidc_callback.php',
+ 'scope' => $db->getSetting('oidc_scopes', 'openid profile email'),
+ 'state' => $oidcState,
+ ]);
+ }
+
$showLocalLogin = isset($_GET['local']) && $_GET['local'] === '1';
} catch (Exception $e) {
@@ -223,6 +244,13 @@ try {
+
+