web-dev-qa-db-fra.com

Comment Drupal vérifie-t-il les sessions à partir de la valeur du cookie?

Désolé, je sais que c'est bizarre, mais j'essaie d'intégrer une autre application php avec Drupal. Je veux savoir si l'utilisateur est actuellement connecté au site Drupal, même si la demande va ailleurs. Je récupère le cookie d'un objet de demande Guzzle. Pour autant que le l'application est concernée (en raison du proxy Nginx), l'origine est la même et le cookie est passé avec succès.

Voici ce que je retire de l'objet de demande Guzzle:

array(1) {
  ["SSESSdbf18a05343cfb88719ee68ff6159a52"]=>
  string(43) "5eW8YPdDPjojAjuokObuD5R2L7cyOfffmBuVAdHzWwU"
}

La valeur ci-dessus est également celle indiquée par le navigateur.

Mais, dans ma table sessions dans la base de données, il n'y a aucune session qui ressemble à ceci, que ce soit dans la colonne sid ou session.

Comment Drupal vérifie la base de données pour un cookie de session valide, et où dois-je chercher dans le noyau pour copier cela?

5
RaisinBranCrunch

Je l'ai compris, mais si quelqu'un publie une réponse plus approfondie, je l'accepterai.

Drupal a un SessionHandler avec une fonction de lecture:

public function read($sid) {
    $data = '';
    if (!empty($sid)) {
      // Read the session data from the database.
      $query = $this->connection
        ->queryRange('SELECT session FROM {sessions} WHERE sid = :sid', 0, 1, [':sid' => Crypt::hashBase64($sid)]);
      $data = (string) $query->fetchField();
    }
    return $data;
  }

Et, si vous bootstrap Drupal, ou appelez un script Drush externe, vous pouvez le faire:

$session_handler = \Drupal::getContainer()->get('session_handler.storage');
$logged_in = (bool) $session_handler->read($session);

Voici comment j'ai retiré le cookie de l'objet Guzzle:

$request->getCookies();
//var_dump($cookies);
foreach($cookies as $cookie){
  if(strpos($cookie, "SESS") == 0){
    $session = $cookie;
  }
}

Si vous voulez réellement l'UID, vous n'aurez pas à faire le cast (bool) et à débloquer la chose, car elle retourne les données brutes MySQL.

5
RaisinBranCrunch