Bonjour à tous,

Je fais appel à vous aujourd'hui car je rencontre un problème sur mon site qui m'empêche de poster des requêtes utilisant des cookies de session. Je vais vous expliquer la situation en détail.

J'héberge mon site chez LWS à l'adresse suivante : https://www.coopratings.fr/. Pour tester, vous pouvez vous connecter avec le login "a@a" et le mot de passe "a".

Lorsqu'un utilisateur souhaite effectuer une action sur mon site, une requête est envoyée au serveur qui vérifie si l'utilisateur est connecté en utilisant la fonction "session_start()" et la variable "_SESSION["isLogged"]".

Le problème est le suivant : sur certaines machines, le cookie "phpsessid" est conservé entre les requêtes, ce qui permet le bon fonctionnement du système de vérification de connexion. Mais sur d'autres machines, le cookie "phpsessid" change à chaque requête, ce qui empêche le système de fonctionner correctement.

En analysant le problème, j'ai remarqué que chaque fois que le navigateur envoie une requête "OPTION" avant une requête "POST", le cookie "phpsessid" change et je ne le vois pas stocké dans la section "Stockage -> Cookies" de l'onglet "F12" du navigateur.

De plus, lorsque j'héberge mon site localement avec XAMPP en utilisant l'URL "http://127.0.0.1/monsite/...", tout fonctionne correctement. Cependant, lorsque j'utilise phpStorm pour afficher la page, il utilise l'URL "http://localhost:63342/monSite/...", et le navigateur envoie des requêtes "OPTION" (ce qui provoque le même problème que celui mentionné précédemment).

Lorsque je suis connecté localement avec "http://localhost:63342/monSite/...", la réponse affiche "Vous n'êtes pas connecté", comme je l'ai configuré pour les cas de POST sans connexion.

En revanche, lorsque je me connecte à l'adresse "https://www.coopratings.fr/", la console affiche les erreurs suivantes :

"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.coopratings.fr/Rest_API/api/reviews/get_mygrade_reviewid.php. (Reason: header ‘content-type’ is not allowed according to header ‘Access-Control-Allow-Headers’ from CORS preflight response)."

"Cross-Origin Request Blocked: The Same Origin Policy disallows reading the remote resource at https://www.coopratings.fr/Rest_API/api/reviews/get_mygrade_reviewid.php. (Reason: CORS request did not succeed). Status code: (null)."

"Uncaught (in promise) TypeError: NetworkError when attempting to fetch resource."

J'ai effectué des recherches approfondies sur Internet et j'ai essayé différentes solutions, mais jusqu'à présent, je n'ai pas réussi à résoudre le problème. Voici ce que j'ai déjà tenté :

  • Gérer les requêtes "OPTION" dans mes fichiers PHP en ajoutant le code suivant :

    if (
        isset($_SERVER['REQUEST_METHOD'])
        && $_SERVER['REQUEST_METHOD'] === 'OPTIONS'
    ) {
        exit();
    }
  • Modifier les en-têtes de réponse avec les configurations suivantes :

    header('Access-Control-Allow-Origin: *');
    header('Access-Control-Allow-Methods: POST, OPTION');
    header('Access-Control-Allow-Headers: Access-Control-Allow-Headers,Content-Type,Access-Control-Allow-Methods, Authorization, X-Requested-With, Accept, Cookie');
    header('Access-Control-Allow-Credentials: true');
  • Ajouter les paramètres "mode: 'cors'" et "credentials: 'include'" dans les requêtes (pas en même temps).

  • Modifier les paramètres des cookies lors de la création de la session :

    public static function startSession(){
        $maxlifetime = 3600;
        $secure = true;
        $httponly = true;
        $samesite = 'None';
    
        if(PHP_VERSION_ID < 70300) {
            session_set_cookie_params($maxlifetime, '/; samesite='.$samesite, $_SERVER['HTTP_HOST'], $secure, $httponly);
        } else {
            session_set_cookie_params([
                'lifetime' => $maxlifetime,
                'path' => '/',
                'domain' => $_SERVER['HTTP_HOST'],
                'secure' => $secure,
                'httponly' => $httponly,
                'samesite' => $samesite
            ]);
        }
    
        session_start();
    }

    Voici comment j'envoie mes requêtes:

    let url = new URL('http://127.0.0.1/coopratings/Rest_API/api/');
    
    return fetch(url + request, {
        method: type,
        body: body,
        headers: {
            "Content-Type": "application/json",
        }
    })
    .then(res => {
        return res.json();
    })

En espérant trouver une solution à ce problème.
Merci d'avance pour votre aide.

Aucune réponse