comment être reconnu comme connecté durant une requête de type « API »
le système dans SPIP qui génère l’API (tel ou tel plugin ou truc perso) doit utiliser les infos de connexion et d’accès restreint si actif
@rheritahiana SPIP n’implémente aucune autre méthode que le HTTP Basic pour l’authentification par requête (que ce soit sur une page HTML ou une action d’API peu importe, n’importe quelle requête qui passe par SPIP). Et il n’y a aucun plugin qui implémente d’autres choses (oAuth ou autre) en tant que serveur (pour que d’autres se connectent dessus quoi).
Mais si tout est bien en HTTPS, au moins ça permet quand même d’utiliser le HTTP Basic. Par contre ça veut dire qu’il faut envoyer le email/password à chacune des requêtes, en tout cas pour celles qui doivent être connectées.
Ce n’est que la première étape, après il faut que ce que génère ton SPIP comme retour utilise ces infos de connexion, mais ça ça dépend totalement de quel plugin et comment c’est implémenté… Moi je ne connais pas du tout le plugin Headless et à quel point tu peux le personnaliser en implémentant/surchargeant toi-même telle ou telle collection à renvoyer.
Ce que je peux dire c’est que quand j’avais fait le plugin Collection-JSON (qui utilise le plugin HTTP abstrait aussi mais ensuite avec un autre format), dans les implémentations c’était possible d’utiliser des squelettes SPIP (qui devaient renvoyer du JSON), et donc comme c’était des boucles SPIP, si t’étais reconnu comme connecté à ce moment bah ça ne renvoyait que ce qui était autorisé, si yavait des boucles ARTICLES ou RUBRIQUES et le plugin Accès restreint. Mais si c’est tout en PHP c’est du SQL beaucoup plus basique généralement, qui est « nul » dans le sens où ça utilise pas du tout toutes les optimisations et ajouts que font les boucles de template (et c’est actuellement chiant et pas facile de reproduire exactement le SQL que font les boucles, mais entièrement en PHP pur).
Voici un code simplifié pour se connecter à un SPIP 4, sans passer par l’API SPIP. C’est donc pour un usage extérieure, comme dans le scénario de la question initiale.
C’est un code simplifié au sens où :
c’est uniquement l’authentification spip
ça ne prend pas en charge les vieux mots de passe d’anciennes versions de SPIP.
ça ne fait pas « tourner » les clés
Ça reprend donc partiellement ce que fait SPIP dans son API.
// Extraire la chaine représentant le JSON du fichier /config/cles.php
// voir /ecrire/inc/flock.php : lire_fichier_securise
$clesFile = '{"secret_du_site":"xxxxxxxxxxxxxx","secret_des_auth":"yyyyyyyyyyyyyyyyyyyy"}';
// Décoder cette chaine en JSON
$clesJson = json_decode($clesFile, true);
// Décoder les valeurs des clés
$cles = array_map('base64_decode', $clesJson);
// Récupérer la clé secrete
$secretKey = $cles['secret_des_auth'];
// ---
$login = 'l-identifiant';
$password_clair = 'le-mdp-en-clair';
// A récupérer dans la table 'spip_auteurs', colonne 'pass'
$password_hash = 'le-password-crypte';
$pass_poivre = hash_hmac('sha256', $password_clair, $secretKey);
$isAuth = password_verify($pass_poivre, $password_hash);
if ($isAuth) {
// authentifé !
}
il ne faut surtout pas faire ça, c’est complètement dépendent de l’implémentation, ça va casser dès qu’on change quelque chose, et comme tu le dis c’est très incomplet.
Normalement tu as pas besoin du tout de te charger de verification du mot de passe, SPIP se charge de tout et te reconnais quand tu fais un hit avec un header Authorization: Basic xxxxxx.
Mais si jamais tu dois vraiment faire une verification manuelle du login+pass de quelqu’un il faut simplement utiliser l’API auth :
include_spip('inc/auth');
$auteur = auth_identifier_login($login, $pass, '', true);
if ($auteur) {
// c'est bien le login/pass d'un auteur qui est décrit dans le tableau $auteur
} else {
// c'est personne de connu
}
Ah oui, si on décode directement le login/mot de passe en dehors de SPIP, cela oblige à une veille, maintenance à chaque mise à jour SPIP, à la manière de la surcharge de fichiers du core. De même la récupération du fichier des clés dans config complexifie la tache.
La méthode du hit http avec un header Authorization: Basic xxxxxx est plus intéressante.