Sign in with ChurchTools – ein Workaround

Wir warten leider schon sehr lange darauf, dass in ChurchTools eine OAuth2.0 Schnittstelle implementiert wird. Dabei hätte diese Erweiterung so viel Potential… Die Akzeptanz in der breiten Masse der Gemeindemitglieder sich Accounts und vor allem Passwörter für verschiedene Systeme einfallen zu lassen ist sehr gering. Mit einer OAuth2.0 Schnittstelle bräuchte es nur einen einzigen ChurchTools Account über den alle Authentifzierung läuft. Es könnte ein Universum verschiedener Anwendungen für die Gemeinde entstehen. Wir könnten für unseren Gemeinden zusätzliche Module entwickeln, die wir ohne weiteres in die bestehende System-Landschaft integrieren. Ein digitales Schwarzes Brett, bei dem ich mich über einen QR-Code direkt anmelde um einen Kommentar zu hinterlassen, eine App für Musiker um ihre Noten digital zu verwalten…

Doch bis die OAuth2.0-Schnittstelle kommt wird wohl noch einige Zeit ins Land gehen. Vielleicht werden wir es auch nicht mehr miterleben. Bis dahin nutzen wir bei uns folgenden Workaround:

Der Funktionsumfang von ChurchTools für unseren Worship-Bereich reicht uns an einigen Stellen nicht aus. Deshalb haben wir dafür ein eigenes Tool in PHP mit dem Framework Laravel entwickelt.

Der Nutzer meldet sich bei unserem WorshipTool mit seiner E-Mail Adresse und Passwort an. Der ChurchTools-API Client wird mit dieser E-Mail und Passwort konfiguriert. Wenn bereits ein Nutzer in der Datenbank des WorshipTools existiert, werden die von ChurchTools abgerufenen Daten (Token, Bild-Url) aktualisiert. Existiert der Nutzer noch nicht, wird ein neuer Datensatz angelegt:

public function authenticate()
{
    $email = $this->get('email');
    $password = $this->get('password');
    $ctUrl = $this->get('ct_url');
    CTConfig::setApiUrl($ctUrl);

    try {
        CTConfig::authWithCredentials($email, $password);

        if (CTConfig::validateApiKey()) {
            $ctUser = PersonRequest::whoami();

            $laravelUser = User::where('email', $email)->where('ct_url', $ctUrl)->first();

            $updateData = [
                "name" =>  $ctUser->getFirstName(),
                "ct_id" => $ctUser->getId(),
                "ct_token" => AuthRequest::retrieveApiToken($ctUser->getId()),
                "ct_image_url" => $ctUser->getImageUrl()
            ];

            if($laravelUser == null){ // Create Model
                $updateData["email"] = $email;
                $updateData["ct_url"] = $ctUrl;
                $laravelUser = User::create($updateData);
            }else{ // Update Model
                $laravelUser->update($updateData);
                $laravelUser->save();
            }

            Auth::loginUsingId($laravelUser->id, $this->boolean('remember'));

            return redirect()->intended();
        }
    } catch (CTAuthException $exception) {
        // ignore exception
    }

    RateLimiter::hit($this->throttleKey());
    throw ValidationException::withMessages([
        'email' => trans('auth.failed'),
    ]);
}

Dabei wird nur der API-Token gespeichert und niemals das Passwort. Der API-Token läuft nach einiger Zeit wieder ab und ist einzigartig.

Die Nachteile dieser Implementierung:

  • Ein Passwort-Manager erkennt das WorshipTool nicht. Der Nutzer muss also aktiv das ChurchTools Passwort raussuchen.
  • Der Nutzer muss dem System vertrauen, dass es das ChurchTools Passwort nicht speichert und vertraulich mit seinen Daten umgeht.
  • Es erfolgt keine Eingrenzung der Berechtigungen auf einen bestimmten Bereich. Das WorshipTool hat über die Authentifizierung mit dem API-Token alle Berechtigungen, die der Nutzer besitzt.

2 Antworten

  1. Avatar von Dominic
    Dominic

    Hallo
    Gerne möchte ich das Login in meinem Laravel Tool auch via Church Tools API umsetzten.
    Das klappt auch sehr gut dank eurem Beispiel Code bis zum Punkt, an welchem einzelne Benutzer einen Multifaktor aktiviert haben.

    Meine Wunsch wäre: Login mit Mail und Passwort, wenn ein Multifaktor beim Benutzer aktiv ist, soll dieser Code in einem 2. Schritt noch abgefragt und geprüft werden.
    Ja, ich bin (nur) Hobby Programmierer und bringe das bisher aber leider nicht auf die Reihe. Könnt Ihr mir hier helfen?

    Gruss, Dominic

  2. Hi Dominic,

    sorry für die späte Antwort, habe leider deinen Kommentar erst heute gesehen. Du kannst direkt den AuthRequest Service benutzen um zu prüfen, ob der Nutzer ein OTP für den Login benötigt:

    „`
    $auth = AuthRequest::authWithEmailAndPassword($email, $password);
    if ($auth->requireMultiFactorAuthentication) {
    // an dieser Stelle OTP abfrage platzieren
    }
    }
    „`

    Den Login mit dem OTP kannst du dann hiermit fortsetzen:
    „`
    AuthRequest::authTwoFactorAuthentication($auth->userId, $totp);
    „`

    Du kannst dir dazu anschauen, wie die Methode „authWithCredentials“ aufgebaut ist: https://github.com/5pm-HDH/churchtools-api/blob/8cb4b81f0026f2dbc3e5c147eed87749e00ea2dc/src/CTConfig.php#L118

    Ich hoffe das hilft dir weiter! Bei Fragen jederzeit gerne melden.

    VG Lukas

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert