1
votes

nodejs: sessionID change après la redirection. Comment garder les données de session utilisateur persistantes?

a rencontré de nombreux problèmes similaires, mais je n'arrive pas à trouver comment les résoudre. J'ai un serveur express, utilisant des sessions de cookies. Le serveur appelle l'API google auth.

Comme il s'agit d'une application pour plusieurs utilisateurs, je dois associer les informations d'authentification google à la session utilisateur

J'enregistre ces données d'authentification dans la session après les avoir récupérés de google. Les données sont bien enregistrées dans la session. Aucun problème ici

Mais après avoir redirigé vers un autre itinéraire express, la session est différente et ne peut donc pas accéder aux données enregistrées.

Voici le code

Merci

app.use(
  session({
    name: SESSION_NAME,
    secret: SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: parseInt(SESSION_LIFETIME, 10), // 24H in config file
      httpOnly: true,
      sameSite: true,
      secure: !IN_DEV
    }
  })
);

googleRouter.get("/oauthcallback", async (req, res) => {
  try {
    if (req.query.code && req.query.code !== "") {
      const oauth2Client = initGoogleAuth();
      const tokens = await getGoogleToken(oauth2Client, req.query.code);

      if (tokens && tokens !== "") {
        const s = await saveTokensInSession(req.session, tokens);

        oauth2Client.setCredentials(tokens);

        // save data in session
        req.session.oauth2Client = oauth2Client;
        req.session.save();

        // oauth2Client is well saved here in session
        console.log(req.session.oauth2Client);

        //redirect to the next url

        res.redirect("/googleauth/test");


      } else res.send("error while getting tokens");
    } else res.send("error while getting  authorization code");
  } catch (error) {
    res.send(`error while getting token : ${error}`);
  }
});


googleRouter.get("/test", async (req, res) => {

 // oauth2Client is empty  here and sessionID is different
 console.log(req.session.oauth2Client);
});


4 commentaires

semble pas de réponse


Avez-vous essayé de rediriger manuellement (comme dans le navigateur) les données de session toujours disponibles?


désolé je n'ai pas compris votre point. Qu'entendez-vous par «redirection manuelle»?


Ouais, au lieu de rediriger avec res.redirec ("/ googleauth / test") , commentez cette ligne et mettez un res.end () , puis au type de votre navigateur l'url et vérifiez si les données de session sont disponibles de cette façon


4 Réponses :


0
votes

npm install --save cors

autorise l'accès au port approprié via le middleware cors

const config = {
      headers: {'Content-Type': 'application/json'},
      withCredentials:true
      };

axios.post('http://your domain address:port/route',{},config)
   .then( response => {
   //response.data your codes
});

Essayez de rediriger via le rappel de la fonction "save".

res.redirect (307, "/googleauth/test");

En cas de méthode post, remplacez-la comme suit.

req.session.save ((err) => {
// try to redirect within callback function
res.redirect ("/googleauth/test");
})

Puis set withCredentials: true dans la configuration de votre module de transfert de données (ex: axios, etc.) dans votre code client.

app.use (cors ({
         credentials: true,
         origin: [
                 "http: // your domain address",
                 "http: // yourdomain address: port"
                 ]
}));


0 commentaires

0
votes

J'ai le même problème que vous, j'ai essayé avec sameSite est "lax", ça marche bien.

app.use(
  session({
    name: SESSION_NAME,
    secret: SESSION_SECRET,
    resave: false,
    saveUninitialized: false,
    cookie: {
      maxAge: parseInt(SESSION_LIFETIME, 10), // 24H in config file
      httpOnly: true,
      sameSite: "lax",
      secure: !IN_DEV
    }
  })
);

Mais je pense que sameSite égal "strict" est nécessaire pour une meilleure sécurité Tout le monde a une solution? Merci


0 commentaires

0
votes

J'ai eu le même problème en cours d'exécution localement où sur res.redirect, l'ID de session a changé et je n'ai pas pu récupérer les données de session enregistrées. J'ai passé de nombreuses heures à examiner ce problème, j'ai essayé toutes les réponses ci-dessus, y compris l'exécution explicite de req.session.save () . Ce qui m'a arrangé, c'est que j'ai réalisé que j'étais redirection vers http://127.0.0.1:3000/path alors que ma page d'origine était sur http: // localhost: 3000 / path .

Express les traite apparemment comme des domaines distincts et, par conséquent, j'obtenais un nouvel identifiant de session lors de la redirection, même s'ils semblaient mener à la même page.


0 commentaires

0
votes

J'ai eu le même problème il y a quelque temps. Je l'ai résolu en ne procédant qu'une fois que j'ai reçu le rappel de la méthode de sauvegarde. Ça a l'air idiot, mais ça marche pour moi.

return new Promise((resolve, reject) => {
    req.session.save((err) => {
        if (err) {
            reject(err);
        }
        resolve(res.redirect("/googleauth/test"));
    });
});

ou

req.session.save((err) => {
    if (err) {
        return res.send("err while saving session information");
    }
    console.log(req.session.oauth2Client);
    return res.redirect("/googleauth/test");
});

Faites-moi savoir s'il fait le travail pour vous.
Référence: https://github.com/expressjs/session/issues/660


0 commentaires