Vérification de password en SPIP 4

Bonjour,
je suis en train de migrer le site sur le SPIP 3 vers le SPIP 4. Je suis bloqué sur la validation de « password ». Dans un module externe pour nos abonnés, nous utilisons la base ‹ auteurs › de SPIP pour gérer les connexions (notamment pour l’API mobile). L’encodage de mdp a changé, je ne trouve pas comment procéder à la vérification du couple de login-mdp.
La logique sur le site sur SPIP 3 :

$password = $_POST["password"];
$pass = //recuperer dans la table spip_auteurs via le login
$alea_actuel = //recuperer dans la table spip_auteurs
$password_encrypt = hash('sha256', ($alea_actuel . $password));
if ($password_encrypt == $pass) {
//le code
}

Merci d’avance pour votre aide !

Bonjour,

Il faut aller voir le code de ecrire/auth/spip.php · 4.3 · spip / spip · GitLab

Merci pour votre réponse ! Est-ce qu’on peut avoir un chemin direct vers \Password et \SpipCles, pour faire « include » sans utiliser « use » ?

tu peux peut être regarder du côté de prive/formulaires/login.php · master · spip / spip · GitLab

Je pense que j’ai trouvé, merci beaucoup.

Si tu veux poster ta solution, pour la postérité :slight_smile:

1 « J'aime »

Malheureusement, ma solution n’a pas marché, mon module externe (qui était écrite en php7) ne reconnait pas des ‹ include › de SPIP4. Par exemple quand j’inclue ‹ ecrire/auth/spip.php › et j’essaye d’utiliser la fonction ‹ auth_spip_dist › je reçois l’erreur « Uncaught Error: Call to undefined function sql_quote() ». ‹ sql_quote() › se trouve dans ‹ ecrire/base/abstract_sql.php › et est utilisé par ‹ auth_spip_retrouver_login › dans spip.php. Je n’ai pas trouvé encore la solution pour cela.

Faut faire require_once 'ecrire/inc_version.php'; (pour SPIP4)
Ou
require_once 'vendor/autoload.php'; (pour SPIP5)

include_spip('base/abstract_sql);` pour déclarer les fonctions SQL si ce n’est pas encore le cas là du coup.

Bonjour à tous, je suis un collègue de Vlad, nous sommes toujours bloqués avec l’inclusion des fonctions. En fait notre API n’est pas située dans les mêmes répertoires que les classes de spip et lorsqu’on essaie de les inclure, nous avons des erreurs de chemins qui remontent.

Afin de clarifier un peu les choses, notre API nous sert à authentifier des utilisateurs qui se sont inscrits sur le site, depuis une application mobile tierce.

L’API se trouve à la racine du site dans un sous répertoire.

Existe-t-il sinon une autre solution type API pour obtenir la validation du coup et récupérer un token utilisateur, ses informations de compte, son ou ses abonnements?

Merci d’avance.

PS : Sujet non résolu au passage.

Le plugin http Serveur HTTP abstrait - Plugins SPIP facilite la mise en place d’une API. La page appelée peut être interrogée par curl dans ton code et renvoyer ce que tu veux.

On a trouvé une solution. On se connecte avec curl par la page de connexion de spip, si authentification valide, on récupère les cookies et après le token nécessaire.
Cela marche pour nous :slightly_smiling_face:

1 « J'aime »

Ah c’est malin.
Voudriez vous présenter le code qui fait ça ?

1 « J'aime »

Oui, voici le code:

// ...some code...
$fields = [
    'page' => 'connexion',
    'formulaire_action' => 'login_public_page',
    'formulaire_action_args' => ''// generated data by SPIP,
    'formulaire_action_sign' => '',
    'var_login' => $_POST['login'] ?? '',
    'password' => $_POST['password'] ?? ''
];

$urlLogin = "https://" . $_SERVER["HTTP_HOST"] . "/spip.php?page=connexion";
$urlLogout = "https://" . $_SERVER["HTTP_HOST"] . "/spip.php?action=logout&logout=public";

$ch = curl_init();

curl_setopt($ch, CURLOPT_URL, $urlLogin);
curl_setopt($ch, CURLOPT_POST, true);
curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($fields));
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_COOKIESESSION, true);
curl_setopt($ch, CURLOPT_COOKIEJAR, '');  // Where to save cookies after the request, but I don't save the file, I get cookie "on the fly"
curl_setopt($ch, CURLOPT_COOKIEFILE, ''); // Where to read cookies from before the request
$response = curl_exec($ch);

$cookies = curl_getinfo($ch, CURLINFO_COOKIELIST);
curl_close($ch);
// handle $cookies
// next code

Quelques commentaires et questions :

« page » => « connexion »,
« formulaire_action » => « login_public_page »,
« formulaire_action_args » => «  »// generated data by SPIP,
« formulaire_action_sign » => «  »,
Ce code-là est hardcoder, je n’arrive pas le récupérer d’ici. Sans ce bout de code authentification ne passe pas. Si je comprends bien, « formulaire_action_args » est unique par serveur (?). Ça fait environs deux mois que je travaille avec le SPIP, je n’ai pas encore compris comment « formulaire_action_args » est généré. Je suis en train de creuser sur ce sujet, mais pour l’instant ça marche comme ça. Donc si vous pouvez m’aiguiller sur ce sujet je serai très reconnaissant :slight_smile:

curl_setopt($ch, CURLOPT_COOKIEJAR, «  »); => Je ne crée pas de fichier (cela prend un certain temps) et ainsi, je peux immédiatement intercepter les cookies. Et ça résout problème s’il y a quelques personnes qui se connectent en même temps.

Ah,
merci.
À noter que le plugin http que j’évoque plus haut vérifie bien que le login et mdp, tels que fournis par l’authentification http Basic, correspondent bien à des comptes SPIP. Ou plutôt en fait : c’est SPIP qui vérifie que les credentials fournis par l’authentification Http Basic correspondent au login et mot de passe d’un utilisateur inscrit, et le plugin http bénéficie de cette vérification en amont de son exécution. Il serait également possible d’appeler une page maison du site SPIP avec un curl maison qui fournirait le login et le mdp dans l’auth Basic si vous les avez.

1 « J'aime »