Hallo zusammen,
in TYPO3 V11 haben wir einen TokenAuthenticationService, der von AbstractAuthenticationService erweitert wurde, implementiert, um es einem Frontend-Benutzer zu ermöglichen, sich anhand einer URL im Frontend anzumelden.
Die URL sieht folgendermaßen so aus: domain/login/logintype=login&token={token}
Auf der Seite "login" haben wir das felogin-Plugin eingebunden. Bei einer erfolgreichen Anmeldung wird der Benutzer über die URL zu einer Seite weitergeleitet (z.B. die Loginseite selbst ), andernfalls wird er auf eine Fehlerseite geleitet.
Wenn die URL im Browser aufgerufen wird, meldet sich der Benutzer erfolgreich im Frontend an und landet auf der Loginseite mit einem Abmelde-Button. Wenn derselbe Link erneut aufgerufen wird, ohne dass der Benutzer sich zuvor abgemeldet hat, wird die Plugin-Seite erneut geladen, und alles funktioniert wie erwartet.
Unter TYPO3 V12 haben wir jedoch ein Problem. Beim ersten Aufruf der URL meldet sich der Benutzer im Frontend an und landet auf der Loginseite mit dem Abmelde-Button und alles soweit gut. Wenn derselbe Link erneut aufgerufen wird, ohne dass der Benutzer sich vorher abgemeldet hat, wird der Benutzer zur Fehlerseite weitergeleitet . Ruft der Benutzer die Loginseite auf, ist er jedoch weiterhin angemeldet.
Hat jemand eine Idee, woran das liegen könnte?
Danke!
CREATE TABLE fe_users
(
fe_token varchar(64) DEFAULT NULL,
UNIQUE INDEX token (fe_token)
);
{
private bool $allowAutoLogin = false;
public function processLoginData(array &$loginData): bool
{
$token = $this->getTokenFromRequest();
if (is_string($token) && 64 === strlen($token)) {
$query = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users');
$query->select('username', 'password')
->from('fe_users')
->where($query->expr()->eq('fe_token', $query->createNamedParameter($token)));
$statement = $query->executeQuery();
$row = $statement->fetchAssociative();
if (!empty($row)) {
$this->allowAutoLogin = true;
$loginData['uname'] = $row['username'] ?? '';
$loginData['uident'] = $row['password'] ?? '';
return true;
}
}
return false;
}
public function getUser()
{
$user = $this->fetchUser(
$this->login['uname']
);
if ($user) {
$hashFactory = GeneralUtility::makeInstance(PasswordHashFactory::class);
$hashInstance = $hashFactory->get($user['password'], $this->pObj->loginType);
// rehash password from database, in order to get a valid password validation from the login service
$user['password'] = $hashInstance->getHashedPassword($user['password']);
}
return $user;
}
public function authUser(): int
{
return $this->allowAutoLogin ? 200 : 100;
}
private function fetchUser($username)
{
$query = GeneralUtility::makeInstance(ConnectionPool::class)->getQueryBuilderForTable('fe_users');
$query->getRestrictions()->removeAll()->add(GeneralUtility::makeInstance(DeletedRestriction::class));
return $query->select('*')
->from('fe_users')
->where(
$query->expr()->eq(
'username',
$query->createNamedParameter($username, Connection::PARAM_STR)
)
)
->executeQuery()
->fetchAssociative();
}
protected function getTokenFromRequest(): ?string
{
/** @var ServerRequest $request */
$request = $this->authInfo['request'] ?? $GLOBALS['TYPO3_REQUEST'];
return $request->getQueryParams()['token'] ?? null;
}
}
Zusammenfassung des Problem unter TYPO3 V12: Wenn der Benutzer schon im Fronted angemeldet hat ( egal ob mit dem Aufruf der Token-Url domain/login/logintype=login&token={token}oder durch Felogin-Anmeldeformular mit der Eingabe von username und password ) dann wurde der Benuzer beim zweiten Versuch sich mit der Token-Url im Frontend anzumelden auf die im felogin-Formular festgelegte Fehlerseite weitergeleitet (wenn er sich vorher nicht abgemeldet hat).
Wenn der Benuzer aber vor dem zweiten Versuch sich aus dem Frontend abmeldet (Oder fe_typo_user Session im Browser löscht ), dann funktionert es und landet man auf die Seite für die erfolgreiche Anmeldung