Wo findet FE Login statt?

Wo ist eigentlich der Code für den TYPO3 Frontend Login? Denn der ist nicht wie gedacht in der sysext „fe_login“ – es findet noch nicht mal ein direkter Aufruf statt. Allein das übermitteln von „user“, „pass“ und „logintype“=“login“ startet bereits die Authentifizierung.

Zuerst mal die Basis-Klassen von TYPO3:

  • typo3/sysext/cms/tslib/ class.tslib_feuserauth.php
  • typo3/sysext/sv/class.tx_sv_authbase.php
  • t3lib/class.t3lib_userauth.php

In der Funktion „compareUident“ findet der Vergleich von Logindaten mit der Datenbank statt.

Mittlerweile ist „saltedpasswords“ mit „rsaauth“ der Standard für Passwörter. Diese stehen jetzt als versalzene MD5 in der Datenbank – was beim Login natürlich berücksichtigt werden muss. Die Funktion compareUident findet man jetzt in:

  • typo3/sysext/saltedpasswords/sv1/ class.tx_saltedpasswords_sv1.php

Und wie funktioniert jetzt der Login?

Nach dem erfolgreichen Vergleich mit compareUident wird beim User das Cookie „fe_typo3_user“ erstellt und ein passender Eintrag in die Tabelle fe_sessions erstellt. Das kann man für einen Quick&Dirty Login ausnutzen. Entweder direkt mit einem INSERT des Cookie-Wert in die Datenbank (hier mit ein paar Beispielwerten):

INSERT INTO fe_sessions (`ses_id`, `ses_name`, `ses_iplock`, `ses_hashlock`, `ses_userid`, `ses_tstamp`, `ses_data`, `ses_permanent`) 
VALUES ('cc9f50e6baaf152824bf094232b70e08', 'fe_typo_user', '128.72', '60672279', '12', NOW(), NULL, '0');

Oder mit diesem Code-Stück von Enlightning Man:

public static function loginUser($userID) {
  $ip = array();
  $ip = explode('.',$_SERVER['REMOTE_ADDR']);

  $fields = array (
    'ses_id' => $_COOKIE['fe_typo_user'],
    'ses_name' => 'fe_typo_user',
    'ses_iplock' => $ip[0].'.'.$ip[1],
    'ses_hashlock' => intval(hexdec(substr(md5(':'.$_SERVER['HTTP_USER_AGENT']),0,7))),
    'ses_userid' => $userID,
    'ses_tstamp' => time(),
    'ses_data' => '',
    'ses_permanent' => 1
  );
  $GLOBALS['TYPO3_DB']->exec_INSERTquery('fe_sessions', $fields);
}

Quelle: http://www.typo3.net/forum/beitraege/extensions_schreiben/71147/

Wie programmiere ich einen Login?

Die einfachste Lösung ist die POST Parameter „user“, „pass“ und „logintype“=“login“ zu setzen. Für Single-Sign-On ist das aber manchmal nicht möglich. Dafür kann man dann den Auth-Mechanismus von TYPO3 nutzen, hier ein Codebeispiel von sk-typo3:

private function checkUser($username, $password) {
        $check = FALSE;
        $loginData = array(
            'username' => $username,
            'uident_text' => $password,
            'status' => 'login',
        );

        $GLOBALS['TSFE']->fe_user->checkPid = ''; //do not use a particular pid
        $info = $GLOBALS['TSFE']->fe_user->getAuthInfoArray();
        $user = $GLOBALS['TSFE']->fe_user->fetchUserRecord($info['db_user'], $loginData['username']);

        if (isset($user) && $user != '') {
            $authBase = new tx_saltedpasswords_sv1();
            $ok = $authBase->compareUident($user, $loginData);
            if ($ok) {
                    //login successfull
                    $GLOBALS['TSFE']->fe_user->createUserSession($user);
                    $check = TRUE;
            } else {
                    //login failed
                   $check = FALSE;
            }
        } else {
            $check = FALSE;
        }
        return $check;
    }

Quelle: http://www.sk-typo3.de/FE-Userlogin-per-Code.191.0.html, Kommentar #17 für saltedpasswords