Bonjour,
Pour une API s’appuyant sur le plugin http, j’ai besoin d’authentifier des demandes de création ou de modification envoyées par POST.
Pour authentifier la demande, un commentaire indique qu’il faut utiliser « l’authentification HTTP que SPIP sait déjà gérer tout seul. » et lie la page wikipedia Authentification HTTP — Wikipédia
J’ai donc créé un rédacteur (autorisé à faire la modif) sur le site cible,
et j’ai agrémenté le POST curl de l’authentification http Basic qui devrait convenir…
mais ça ne semble pas le faire :
lorsque les autorisations sont vérifiées, le $qui n’est pas instancié,
c’est à dire que SPIP n’a pas utilisé l’authenticate http pour loger l’auteur décrit.
Ai je mal compris ?
Sur spip.net j’ai trouvé la doc de $GLOBALS[’ignore_auth_http’] qui désactive cette auth, mais rien sur l’auth elle même.
Comment faire fonctionner l’authentification http avec SPIP sur ce POST ?
Pour info, voici le code simplifié qui POSTe.
<?php
const _ORGANISATION_LOGIN = 'annonces.oasis';
const _ORGANISATION_MDP = 'annonces.oasis';
// 0 pas d'auth http
// 1 avec CURLOPT_USERPWD
// 2 avec CURLOPT_HTTPHEADER
$mode_auth = 2;
$username = _ORGANISATION_LOGIN;
$password = _ORGANISATION_MDP;
$url = 'https://NDD/http.api/leformat/annonces';
// 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);
switch ($mode_auth) {
case 1:
curl_setopt ($ch, CURLOPT_HTTPAUTH, CURLAUTH_BASIC);
curl_setopt ($ch, CURLOPT_USERPWD, "$username:$password");
curl_setopt ($ch, CURLOPT_HTTPHEADER, array('Content-Type: application/json'));
break;
case 2:
$headers = array(
'Content-Type:application/json',
'Authorization: Basic '.base64_encode("$username:$password")
);
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
break;
default:
break;
}
// curl_setopt ($ch, CURLOPT_HEADER, 1); // pas bon là
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, true); // réponse = chaîne
curl_setopt ($ch, CURLOPT_POST, true);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $data);
$response = curl_exec ($ch);
if (curl_errno ($ch)) {
echo 'Erreur cURL : ' . curl_error ($ch);
} else {
$httpCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
echo "Code de statut HTTP : $httpCode\n<br>";
echo "Réponse :<br>";
if ($decoded = json_decode ($response)) {
echo "<pre>".print_r($decoded, 1).'</pre>';
}
else {
echo $response;
}
}
curl_close ($ch);