Récupérer des informations de Drupal 10 depuis une application php tierce standalone

Information importante

En raison d'un grand nombre d'inscriptions de spammers sur notre site, polluant sans relache notre forum, nous suspendons la création de compte via le formulaire de "sign up".

Il est néanmoins toujours possible de devenir adhérent•e en faisant la demande sur cette page, rubrique "Inscription" : https://www.drupal.fr/contact


De plus, le forum est désormais "interdit en écriture". Il n'est plus autorisé d'y écrire un sujet/billet/commentaire.

Pour contacter la communauté, merci de rejoindre le slack "drupalfrance".

Si vous voulez contacter le bureau de l'association, utilisez le formulaire disponible ici, ou envoyez-nous un DM sur twitter.

Bonjour

Je souhaite authentifier des utilisateurs dans une application tierce (standalone) via Drupal 10 mais je n’y arrive pas. Dans drupal 7 on peut utiliser le contexte Drupal en appelant drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL) dans une application standalone mais la fonction n’existe pas en drupal 10. J’ai utilisé les deux solutions suivantes mais aucune ne fonctionne, comme s’il y a un blocage au niveau des autorisation du « partage de session. »

1- Dans mon application tierce J’ai fait un curl en php sur une vue drupal de type export REST qui contient un filtre « User : Actuel » mais le filtre ne fonctionne pas quand on fait un appel de depuis le fichier standalone /home/monsite/public_html/drupal/web/intranet-mgmt/drupal.php. Alors que l'aperçu de la vue ou l'exécution de l'url REST dans un autre onglet fonctionnent. Quand je supprime le filtre je récupère bien une liste d’utilisateurs mais il n’est pas possible de déterminer l’utilisateur courant, c’est donc le filtre qui ne marche pas dans le contexte du CURL.

// Création de la requête cURL pour accéder au point de terminaison REST
$ch = curl_init($DRUPAL10_RESTPOINT_CURRENTUSER);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Accept: application/json',
'Authorization: Basic BASE64ADMIN:PASS’,
// 'Authorization: Bearer ' . $sessionToken
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

2- J'ai essayé de partager une variable de session de Drupal dans le hook suivant, qui est exécuté quand le user se connecte :

use Psr\Log\LoggerInterface;
use Drupal\Core\Session\AccountInterface;
function ism2_users_user_login($account) {
// Sauvegarder les informations de l'utilisateur dans la session.
$_SESSION['user_info'] = "toto";
// Enregistrer la variable de session dans le log "ism2_users".
$logger = \Drupal::logger('ism2_users');
$logger->debug('Contenu de la variable de session : @session', ['@session' => json_encode($_SESSION['user_info'])]);
// 
}

La variable est bien enregistrée dans le log quand le user se connecte.
Mon fichier non-drupal situé dans /home/monsite/public_html/drupal/web/intranet-mgmt/drupal.php contient :

<?php
session_start
();
echo
"(A)<br><br>";
var_dump($_SESSION);
echo
"(B)<br><br>";
var_dump($_SESSION['user_info']);
exit;
?>

Quand j’exécute https://monsite.univ-amu.fr/intranet-mgmt/drupal.php
La session est vide Il s’affiche :

<em><em>(A)

array(0) { } (B)

NULL</em></em>

Pouvez-vous m’aider ?
Merci par avance

Cordialement

Bonjour
Finalement ça fonctionne bien avec $_COOKIE mais j'aurais préféré utilisé $_SESSION.
Dans le hook_user_login (qui est appelé suite à l'authentification de l'utilisateur) de Drupal, j'ai pu transmettre les informations à l'application "standalone" en créant un cookie de domaine qui contient le UID de l'utilisateur, au de mettre celui-ci dans une variable de session. Je peux le récupérer dans l'application standalone avec ($_COOKIE), ce qui ne fonctionnait pas avec une variable de session ($_SESSION renvoie un array vide) Puis dans l'application standalone j'appelle l'export REST par CURL avec une authentification base 64 dans le leader et un filtre contextuel sur l'URL transmis dans le chemin de l'URL REST (au lieu du filtre "standard" User : Current qui ne fonctionnait pas).

  • HOOK login drupal 10 :

    <?php
    function mymodule_users_user_login($account) {
     
    // Obtenir l'identifiant du compte
     
    $accountId = $account->id();

      // Générer une clé de chiffrement sécurisée
     
    $encryptionKey = "cledecchiffrement";

    // Crypter l'identifiant du compte
     
    $encryptedAccountId = openssl_encrypt($accountId, 'AES-256-CBC', $encryptionKey, 0, substr(md5($encryptionKey), 0, 16));

      // Convertir le texte crypté en une représentation sûre pour les cookies
     
    $safeEncryptedAccountId = base64_encode($encryptedAccountId);

      // Définir les informations du cookie
     
    $cookieName = 'user_info';
     
    $cookieValue = $safeEncryptedAccountId;
     
    $cookieExpiration = 0; // Cookie expirant à la fin de la session
     
    $cookiePath = '/app'; // Chemin du cookie pour domain.fr/app
     
    $cookieDomain = '.domain.fr'; // Domaine du cookie

      // Définir le cookie
      setcookie($cookieName, $cookieValue, $cookieExpiration, $cookiePath, $cookieDomain);
    }
    ?>

  • script PHP standalone :

<?php
$DRUPAL10_RESTPOINT_CURRENTUSER
=https://domain.fr/restviewcurrentuser/%USERID?_format=json;
$DRUPAL_ADMIN="drupaladmin";
$DRUPAL_PASS="drupalpassword";
   
   
// Récupérer la valeur du cookie
 
$cookieValue = $_COOKIE['user_info'];
   
// Clé de chiffrement (à utiliser pour le cryptage et le décryptage)
$encryptionKey = 'cledecchiffrement'; // Remplacez par la même clé secrète utilisée pour le chiffrement
   
 // Décoder la valeur du cookie à partir de l'encodage Base64
 
$decodedCookieValue = base64_decode($cookieValue);
   
 
// Déchiffrer le contenu du cookie
$decryptedAccountId = openssl_decrypt($decodedCookieValue, 'AES-256-CBC', $encryptionKey, 0, substr(md5($encryptionKey), 0, 16));

$drupalCredentialsBase64 = base64_encode($DRUPAL_ADMIN.":".$DRUPAL_PASS);

// Création de la requête cURL pour accéder au point de terminaison REST avec le jeton de session
$endpoint=str_replace("%USERID", $decryptedAccountId, $DRUPAL10_RESTPOINT_CURRENTUSER);
$ch = curl_init($endpoint."&".$decryptedAccountId);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
   
'Content-Type: application/json',
   
'Accept: application/json',
   
'Authorization: Basic '.$drupalCredentialsBase64,
));
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);

// Exécution de la requête cURL avec le jeton de session
$response = curl_exec($ch);

// Vérification des erreurs lors de la requête avec le jeton de session
if (curl_errno($ch)) {
    echo
'Erreur cURL : ' . curl_error($ch);
   
// Gestion des erreurs
} else {
   
// Traiter la réponse
   
var_dump ($response);
}
// Fermeture de la ressource cURL pour la deuxième requête
curl_close($ch);
?>