sourceDESK kann als OAuth-Identitätsserver für andere Applikationen dienen. Dies kann dazu genutzt werden, sourceDESK als Identitätsprovider in Ihrem Unternehmen zu nutzen und so Zugriffsrechte und Zugangsdaten zentral zu verwalten.
Aktivierung des OAuth-Systems
Zur Aktivierung des OAuth-Systems müssen die Addons "OAuth-Server" und "OAuth-Konfiguration" aktiviert werden. Allen Administratoren, die sich via OAuth authentifizieren dürfen sollen, muss ein Zugriffsrecht für das Addon "OAuth-Server" eingeräumt werden. Administratoren des OAuth-Systems muss ein Zugriffsrecht für das Addon "OAuth-Konfiguration" eingeräumt werden.
Konfiguration des OAuth-Systems
Administratoren mit Zugriffsrecht für das Addon "OAuth-Konfiguration" können die Client-Systeme konfigurieren. Dazu rufen Sie die Konfiguration unter "Addons > OAuth2" auf. Um einen Client zu erstellen benötigen Sie eine alphanumerische Client-ID und eine Redirect-URL, auf die der zu Authentifizierende nach erfolgreicher Authentifizierung weitergeleitet wird. Bei Erstellung eines Clients wird Ihnen einmalig das Client-Secret angezeigt, bitte notieren Sie sich dieses, da es später nur noch über die Datenbank abgerufen werden kann und aus Sicherheitsgründen nicht mehr angezeigt wird.
Konfiguration des Clients
Token-URL: SOURCEDESK_URL/oauth2
Authentication-URL: SOURCEDESK_URL/admin/?p=oauth2
Userdata-URL: SOURCEDESK_URL/oauth2/user
Ablauf der Authentifizierung
A = Authentifizierungs-Server (sourceDESK)
B = Dritt-Applikation, die Authentifizierung möglich
C = Administrator
- C bittet B um Login
- B bittet A um Challenge
- B leitet C auf Challenge-Seite weiter
- C identifiziert sich gegenüber A
- A leitet C zu B weiter (mit Response)
- B verifiziert Authentifizierung bei A, ruft die Daten von C bei A ab und führt den Login durch
Beispiel-Implementierung in PHP
Das nachfolgende Beispiel zeigt eine beispielhafte Implementierung einer OAuth-Identifizierung mit sourceDESK als Authentifizierungsserver in PHP:
$authenticated = false; $oauthAuthUrl = "https://sourceway.de/admin/?p=oauth2"; $oauthTokenUrl = "https://sourceway.de/de/oauth2"; $oauthUserUrl = "https://sourceway.de/de/oauth2/user"; $oauthJsonPath = "email"; $oauthJsonValue = ["max@mustermann.de", "john@doe.com"]; $oauthClient = "some_client"; $oauthSecret = "pn3g7pgpy36jtegj68j98t34kf6prtmb"; if (!$authenticated && isset($_GET['code'])) { $pars = [ "grant_type" => "authorization_code", "client_id" => $oauthClient, "client_secret" => $oauthSecret, "code" => $_GET['code'], ]; $ch = curl_init($oauthTokenUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($pars)); $res = json_decode(curl_exec($ch)); curl_close($ch); if(is_object($res) && isset($res->access_token)){ $ch = curl_init($oauthUserUrl); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query(["access_token" => "Bearer " . $res->access_token])); $res = json_decode(curl_exec($ch)); curl_close($ch); $ex = explode(",", $oauthJsonPath); $current = $res; foreach($ex as $p){ if(!isset($current->$p)) continue; $current = $current->$p; } if(in_array($current, $oauthJsonValue)){ $authenticated = true; } } } if ($authenticated) { echo "Some protected content"; } else { $ex = explode("?", $oauthAuthUrl); if(count($ex) == 2) parse_str($ex[1], $pars); else $pars = []; $pars["client_id"] = $oauthClient; $pars["state"] = "1"; $pars["response_type"] = "code"; header('Location: ' . $ex[0] . "?" . http_build_query($pars)); exit; }