web-dev-qa-db-fra.com

Connexion d'un utilisateur sans obtenir son mot de passe

Mon exigence est quelque chose comme une connexion par Facebook, afin que l'utilisateur ne fournisse pas de mot de passe, mais qu'il soit connecté. Je souhaite qu'un utilisateur soit connecté depuis le code de son extension en connaissant son user id and/or username but not password.

Comment je fais ça? J'ai également essayé d'obtenir le mot de passe crypté de l'utilisateur à partir de la base de données et de mettre le nom d'utilisateur et ce mot de passe dans la méthode login (), puis quelque chose s'est mal passé, obtenant username and password mismatch error, bien que connecté!

J'ai aussi trouvé des codes de googler -

JPluginHelper::importPlugin('user');
$options = array();
$options['action'] = 'core.login.site';
$response->username = "user_name_here";
$result = $app->triggerEvent('onUserLogin', array((array)$response, $options));

Cela semble fonctionner, mais je ne sais pas s'il y a une chance que cela se trompe plus tard en procédant de la sorte dans les versions 2.5 et 3.0.

6
dev-m

Autant que je sache, aucun élément de celui-ci n'est obsolète. Ce code devrait donc continuer à fonctionner correctement dans les installations 2.5 et 3.0. Même si quelque chose devient obsolète, vous devriez pouvoir l'exécuter au moins avec la version 4.0.

Cela étant dit, aucune de ces pièces ne risque d’être enlevée. Vous importez les plugins utilisateur, puis déclenchez l'événement onUserLogin. C'est la méthode standard pour déclencher les plugins, elle devrait donc être cohérente pendant un moment.

Le seul autre élément à retenir est que vous compromettez la sécurité d'exiger qu'un utilisateur se connecte avec son mot de passe. Assurez-vous que la pièce que vous utilisez pour la remplacer est également sécurisée.


Mise à jour par commentaire

L’appel triggerEvent passe par les différents plugins utilisateur (disponibles sur plugins/user/ et appelle la méthode onUserLogin si elle existe. La fonction clé est celle du plugin joomla. Je copie toute la fonction ci-dessous:

public function onUserLogin($user, $options = array())
{
    $instance = $this->_getUser($user, $options);

    // If _getUser returned an error, then pass it back.
    if ($instance instanceof Exception)
    {
        return false;
    }

    // If the user is blocked, redirect with an error
    if ($instance->get('block') == 1)
    {
        $this->app->enqueueMessage(JText::_('JERROR_NOLOGIN_BLOCKED'), 'warning');

        return false;
    }

    // Authorise the user based on the group information
    if (!isset($options['group']))
    {
        $options['group'] = 'USERS';
    }

    // Check the user can login.
    $result = $instance->authorise($options['action']);

    if (!$result)
    {
        $this->app->enqueueMessage(JText::_('JERROR_LOGIN_DENIED'), 'warning');

        return false;
    }

    // Mark the user as logged in
    $instance->set('guest', 0);

    // Register the needed session variables
    $session = JFactory::getSession();
    $session->set('user', $instance);

    // Check to see the the session already exists.
    $this->app->checkSession();

    // Update the user related fields for the Joomla sessions table.
    $query = $this->db->getQuery(true)
        ->update($this->db->quoteName('#__session'))
        ->set($this->db->quoteName('guest') . ' = ' . $this->db->quote($instance->guest))
        ->set($this->db->quoteName('username') . ' = ' . $this->db->quote($instance->username))
        ->set($this->db->quoteName('userid') . ' = ' . (int) $instance->id)
        ->where($this->db->quoteName('session_id') . ' = ' . $this->db->quote($session->getId()));
    $this->db->setQuery($query)->execute();

    // Hit the user last visit field
    $instance->setLastVisit();

    return true;
}

Ce plugin ne vérifie pas le mot de passe du tout (c'est fait par les plugins d'authentification). Donc, ceci vérifie principalement que l'utilisateur n'est pas bloqué et peut se connecter avant de définir ses données dans la session.

Ce stockage de session est la clé pour montrer à l'utilisateur qu'il est connecté. Naturellement, vous pouvez simplement utiliser ce code directement, mais il serait en réalité bien plus compliqué que de laisser ce plugin vérifier que l'utilisateur n'est pas bloqué, leurs informations dans la session, et marquant l'heure de la dernière visite.

4
David Fritsch

Si vous changez cela, ça va marcher:

 JPluginHelper :: importPlugin ('utilisateur'); 
 $ Options = array (); 
 $ Options ['action'] = 'core.login.site'; 
 $ réponse = array (); // Ajoute cette ligne 
 $ Response ['language'] = ""; // Ajoute cette ligne 
 $ Response ['nomutilisateur'] = "nom_utilisateur_ici"; // Changer cette ligne 
 $ Result = $ app-> triggerEvent ('onUserLogin', array ((array) $ response, $ options)); 
0
Alireza Balvardi