Zuletzt geändert am 4. Oktober 2018 um 23:09

OAuth

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

  1. C bittet B um Login
  2. B bittet A um Challenge
  3. B leitet C auf Challenge-Seite weiter
  4. C identifiziert sich gegenüber A
  5. A leitet C zu B weiter (mit Response)
  6. 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;
}