Bonjour a tous,
je suis nouveau sur SPIP et J’ai regardé le sujet ci-dessous avec intérêt car j’essaie de faire une connexion directe à SPIP depuis mon site avec cURL pour éviter aux utilisateurs (visiteurs public sur rubriques dans zone à accès restreint) de refaire une connexion.
Le sujet : 11 j
Nous avons le login et le password suite à la connexion de l’utilisateur au site. ceci semble bien se passer car la connexion est établie (Se déconnecter) dans la page SPIP qui fait suite à l’appel curl_exec(), et de plus, si la l’article est nommé lors de l’appel, il s’ouvre.
Mais dès la lecture d’un article et que SPIP démarre, et que la page d’appel est quittée lors de l’appel d’un autre article, la connexion tombe.
Voici une partie du code issu de vos posts, que j’ai utilisé :
$username = ‹ mon_login ›;
$password = ‹ mon_password ›;
// Données à envoyer (WIP format à enrichir et compléter)
/*
$data = [
‹ texte › => 'le texte le texte le texte le texte le texte le texte ',
‹ titre › => ‹ le titre ›
];
$data = http_build_query ($data); // url-encode
*/
$ch = curl_init ($url);
…
Votre aide serait la bienvenue car je teste toutes vos solutions sans m’en sortir.
Donc, la suite. Je n’ai pas précisé que certains articles étaient en espace restreint et restreint partiel. J’obtiens la page suivante en fichier joint et me demande comment corriger.
Si mon sujet intéresse quelqu’un(e) .
jsp ce que tu nous montres et jsp si tu auth avec un header `Authorization: Basic xxxxxx`` comme évoqué sur Vérification de password en SPIP 4 - #26 par etarcos et indiqué sur [Résolu] Authentification HTTP, mais dans ce cas il faut évidement le faire à chaque requête, la première comme les suivantes. Et si tu codes en dehors de spip depuis un « programme php », bah ce programme php doit gérer de son côté les données nécessaires pour y accéder quand il y en a besoin…
Merci pour la réponse JLuc,
En effet, je me connecte depuis un programme externe avec Authorization: Basic xxxxxx, avec $url = « http://localhost/spip/spip.php? ».$article; et mon objectif est de rester ensuite dans l’environnement SPIP pour naviguer dans les rubriques et les articles afin que le visiteur qui s’est connecté hors SPIP n’aie pas à le refaire.
J’ai bien vu comme tu le fais constater, que si j’utilisais les liens de la page spip pour consulter d’autres articles, la connexion était perdue.
J’ai donc tenté de garder une connexion permanente dans le programme qui appelle spip.php, en mettant les 3 variables session ci dessousà jour à partir de id_auteur que je récupère à partir de
…
$auteur = auth_identifier_login($username, $pass, ‹ ›, true);
…
et
$id_auteur = sql_getfetsel(…
…
puis
session_set(« id_auteur », $id_auteur);
session_set(« login », $login);
session_set(« statut », « 6forum »);
ainsi, dans la page spip.php contenue dans le php appelant, la connexion est bien maintenue lorsque je clique sur un lien de rubrique ou article différent, mais j’ai ce message « Accès interdit » qui empêche l’affichage du bas de page.
Sinon, le comportement de l’affichage des articles selon qu’ils sont autorisés ou pas, est correct.
Je ne sais pas résoudre ce dernier point … que manque-t-il dans l’environnement de SPIP pour éviter cette erreur 403 ?
Le problème ne se pose que pour le bas de page ?
Dans ce cas il faut voir quelle est la noisette incriminée, puis la spécificité de son inclusion et de son code.
Oui, bas de page à partir de « un commentaire ? » et la partie de droite ne s’affiche pas non plus.
récent sur SPIP, Je ne connais pas la notion de noisette ni quel log utiliser pour traquer ce bug. J’ai abandonné la solution curl. Voici le script qui génère l’erreur :
<?php
if(!isset ($_SESSION)){
session_start();
}
use function SpipLeague\Component\Kernel\param;
use Spip\Chiffrer\Password;
require_once __DIR__ . '/vendor/autoload.php';
$ecrire = param('spip.dirs.core');
include_once $ecrire . 'inc_version.php';
// Inclure l'initialisation de SPIP
include_once("config/ecran_securite.php");
include_spip($ecrire .'inc/session');
include_spip($ecrire .'inc/headers'); // Charge la fonction redirige_url()
include_spip($ecrire .'inc/utils'); // Charge la fonction _request()
//include_spip($ecrire .'inc/sql'); // Charge les fonctions SQL comme sql_getfetsel()
//include_spip( $ecrire . 'inc/auth.php');
require_once('ecrire/inc/auth.php');
$article = 13;
$username = 'monLogin';
$pass = 'monPassword';
//Vérification de l'existence du compte utilisateur dans SPIP
$auteur = auth_identifier_login($username, $pass, '', true);
if ($auteur) {
// c'est bien le login/pass d'un auteur qui est décrit dans le tableau $auteur
echo("<br>Le demandeur a été authentifé !</br>");
// Initialiser la connexion SQL
spip_connect();
} else {
// c'est personne de connu
echo("<br>Inconnu !<\br>");
}
$auteur = $auteur['id_auteur'];
// Vérifier et établir la session
if ($id_auteur = $auteur . "' AND statut='6forum' AND
pass=" . sql_quote (Password::hacher($pass, null))) {
// Créer une session pour cet utilisateur
session_set("id_auteur", $id_auteur);
session_set("login", $login);
session_set("statut", '6forum');
// L'utilisateur est déjà connecté, rediriger vers l'article
$id_article = intval(_request('id_article'));
$url = url_de_base() . './?article'.$article;
header("Location: $url");
// Rediriger ou continuer le script
echo "Connexion réussie ! ID auteur : " . $id_auteur;
} else {
echo "Échec de la connexion : login ou mot de passe incorrect.";
Le code cité c’est pas correct : il manque au moins un $ pour php. Mais aussi des parenthèses pour la lisibilité et des petits morceaux de code pour le fonctionnement j’ai l’impression + Effectivement commencer par « triple backquote php » le rendra plus lisible ici.+ Peux tu préciser « où » est ce code et comment est il appelé ? + Il serait intéressant de le comparer avec le code utilisé pour la partie de la page « qui marche bien ».
est une chaîne. Ce n’est pas une requête sql (il manque SELECT etc) et encore moins son résultat donc le if est toujours vérifié mais $id_auteur n’est pas un id_auteur.
J’ai corrigé l’erreur de condition sur $id_auteur et ??
et ça fonctionne, pour le moment… Je continue à tester… Grand merci pour vos conseils éclairés.
JLuc, voici mon script que j’ai mis sous localhost/spip/test_connexion.php
<?php
if(!isset ($_SESSION)){
session_start();
}
use function SpipLeague\Component\Kernel\param;
require_once __DIR__ . '/vendor/autoload.php';
$ecrire = param('spip.dirs.core');
include_once $ecrire . 'inc_version.php';
// Inclure l'initialisation de SPIP
include_once("config/ecran_securite.php");
include_spip($ecrire .'inc/session');
include_spip($ecrire .'inc/headers'); // Charge la fonction redirige_url()
include_spip($ecrire .'inc/utils'); // Charge la fonction _request()
include_spip($ecrire .'inc/sql'); // Charge les fonctions SQL comme sql_getfetsel()
//include_spip( $ecrire . 'inc/auth.php');
require_once('ecrire/inc/auth.php');
$article = 13;
$username = 'monLogin';
$pass = 'monPassword';
//Vérification de l'existence du compte utilisateur dans SPIP
$auteur = auth_identifier_login($username, $pass, '', true);
if ($auteur) {
// c'est bien le login/pass d'un auteur qui est décrit dans le tableau $auteur
echo("<br>Le demandeur a été authentifé !</br>");
// Initialiser la connexion SQL
spip_connect();
} else {
// c'est personne de connu
echo("<br>Inconnu !<\br>");
}
$id_auteur = $auteur['id_auteur'];
//var_dump($auteur);
// Vérifier et établir la session
if ($id_auteur) {
// Créer une session pour cet utilisateur
session_set("id_auteur", $id_auteur);
session_set("login", $username);
session_set("statut", '6forum');
// L'utilisateur est déjà connecté, rediriger vers l'article
$url = url_de_base() . './?article'.$article;
header("Location: $url");
// Rediriger ou continuer le script
echo "Connexion réussie ! ID auteur : " . $id_auteur;
} else {
echo "Échec de la connexion : login ou mot de passe incorrect.";
}