AuthenticationService error in TYPO 3: "updateLoginTimestamp () must be of the type integer, null given"

841 views Asked by At

I would like to implement a login at TYPO3 v8.7. Here it is so that the data comes from a foreign provider who should log in automatically with his login data of his system at TYPO3. I developed something for that.

What is wrong?

    // Authentication Service
    \TYPO3\CMS\Core\Utility\ExtensionManagementUtility::addService(
        $_EXTKEY,
        'auth',
        'TEST\\Tests\\Service\\AuthenticationService',
        array(
            'title' => 'User authentication service',
            'description' => 'Authentication with username',

            'subtype' => 'getUserFE, authUserFE',

            'available' => true,
            'priority' => 90,
            'quality' => 90,

            'os' => '',
            'exec' => '',

            'className' => 'TEST\\Tests\\Service\\AuthenticationService',
        )
    );

This is in ext_localconf.php

class AuthenticationService extends \TYPO3\CMS\Sv\AuthenticationService
{

    function init() {
        $available = parent::init();
        return $available;
    }

    public function getUser(){

        $remoteUser = $this->getRemoteUser();

        $user = $GLOBALS['TYPO3_DB']->exec_SELECTgetRows(
            '*',
            'fe_users',
            'username = '.$GLOBALS['TYPO3_DB']->fullQuoteStr($remoteUser, 'fe_users') . ' AND deleted = 0'
        );

        return $user;
    }

    public function authUser($user)
    {
        $userData = $user[0];

        foreach ($user[0] as $item => $key) {
            if (is_numeric($key)) {
                $result_array[$item] = (int) $key;
            } else {
                $result_array[$item] = $key;
            }
        }

        $this->login = $loginData = array(
            'uname' => $userData["username"],
            'uident_text' => $userData['password'],
            'status' => 'login'
        );

        $ok = $this->compareUident($result_array, $loginData);

        if($ok == 1) {
            return 200;
        }
        return 100;
    }

    /**
     * Returns the remote user.
     *
     * @return string
     */
    protected function getRemoteUser()
    {
        [...]

        return $user;
    }

}

Is that all right, what am I doing?

In the function remoteUser I get the username of the third party provider.

Whenever I enter the GET parameter, the AuthService is triggered. However, I get the following error message:

"updateLoginTimestamp () must be of the type integer, null given"

Unfortunately I do not find the mistake I make. Hence my question if anyone sees where this is?

1

There are 1 answers

0
Wolffc On

The getUser() Method should Return an Array of the User reccord

which is equal to a database row of fe_users

i am Guessing there is no existing fe_user for the username you get from getRemoteUser thus its the job of the Authentication service to create/update a record for this user in the table fe_users.

so in a more step by stepp manner your service should follow the following steps in get user: 1. get Remote Username 2. check if Remote Username exists in fe_users table 3. if not create an new entry for Remote Username in fe_users 4. select the entry of Remote Username from fe_users and return the row.