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 Réponses :
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" Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â Â ] }));
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
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.
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
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 unres.end ()
, puis au type de votre navigateur l'url et vérifiez si les données de session sont disponibles de cette façon