2017-10-18 14 views
1

J'utilise node.JS avec le module de requête.Noeud demande comment gérer les sessions

Mon problème est que je dois authentifier l'utilisateur à chaque requête car la session est détruite en dehors du bloc .then((response) => {}).

Comment est-il possible de sauvegarder la session créée dans une classe pour une utilisation ultérieure?

J'ai tout essayé sans succès.

Voici un ne fonctionne pas le code snippet

login() { 
const getLoginUrl = 'https://www.demourl.com/' 
const postLoginUrl = 'https://www.demourl.com/account/login/' 

rp({ 
     url: getLoginUrl, 
     jar: this.cookieJar, 
     method: 'GET' 
    }) 
    .then((body) => { 
     var csrftoken = this.cookieJar.getCookies(getLoginUrl)[1].toString().split('=')[1].split(';')[0]; 

     var args = { 
      url: postLoginUrl, 
      json: true, 
      method: 'POST', 
      data: { 
       username: this.username, 
       password: this.password 
      }, 
      headers: { 
       'method': 'POST', 
       'path': '/account/login/', 
       'cookie': 'csrftoken=' + csrftoken, 
      }, 
      jar: this.cookieJar, 
      resolveWithFullResponse: true 
     } 

     rp(args) 
      .then((response) => { 
       //Here is a valid session 
       //But how can I use this session in different functions? 
       console.log('Post demourl.com/account/login success'); 
      }) 
      .catch((error) => { 
       console.log('Post demourl.com/account/login error: ', error); 
      }); 
    }) 
    .catch((error) => { 
     console.log('Get demourl.com error: ', error); 
     }); 
} 
+1

si vous utilisez express.js, essayez d'utiliser middleware https://expressjs.com/fr/guide/using-middleware.html. Si ce n'est pas le cas, vous pouvez avoir une fonction middle ware avec n'importe quel chemin, qui s'exécuterait pour n'importe quelle requête –

Répondre

1

vous devez utiliser cette fonction comme un middleware puis attacher tout ce que vous voulez joindre à votre req

essayer en vous script principal faire

'use strict' 
 

 
const express = require('express'); 
 
const login = require('./login'); 
 
const app = express() 
 

 

 
app.use(login);// use this if you want all your routes to check login or put it in a specific route 
 

 
app.get('/', (req,res)=>{ 
 
//this route is only for loged in users 
 
}); 
 

 
const server = http.createServer(app).listen(process.env.PORT); 
 

 

 
module.exports = app;

et dans votre script de connexion

const login = (req, res, next) => { 
 
    const getLoginUrl = 'https://www.demourl.com/' 
 
    const postLoginUrl = 'https://www.demourl.com/account/login/' 
 

 
    rp({url: getLoginUrl, jar: this.cookieJar, method: 'GET'}) 
 
     .then((body) => { 
 
      var csrftoken = this.cookieJar.getCookies(getLoginUrl)[1].toString().split('=')[1].split(';')[0]; 
 

 
      var args = { 
 
       url: postLoginUrl, 
 
       json: true, 
 
       method: 'POST', 
 
       data: { 
 
        username: this.username, 
 
        password: this.password 
 
       }, 
 
       headers: { 
 
        'method': 'POST', 
 
        'path': '/account/login/', 
 
        'cookie': 'csrftoken=' + csrftoken, 
 
       }, 
 
       jar: this.cookieJar, 
 
       resolveWithFullResponse: true 
 
      } 
 

 
      rp(args) 
 
       .then((response) => { 
 
        res.loginResponse = response; // save the response for later use 
 

 
        console.log('Post demourl.com/account/login success'); 
 
        next(); 
 
       }) 
 
       .catch((error) => { 
 
        console.log('Post demourl.com/account/login error: ', error); 
 
        return res.send(error) //send the error 
 
       }); 
 
     }) 
 
     .catch((error) => { 
 
      console.log('Get demourl.com error: ', error); 
 
      return res.send(error) //send the error 
 
     }); 
 
} 
 

 
module.exports = login

+0

N'y a-t-il aucun moyen d'utiliser la fonction sans intermédiaire entre les deux? – Phil795

1

Je ne vois jamais this.cookieJar étant défini. Assurez-vous qu'il est initialisé quelque part:

this.cookieJar = request.jar(); 

Si vous utilisez un seul CookieJar dans votre application, vous pouvez également utiliser cookie jar global de demande en définissant l'option jar à true:

// Either by setting it as the default 
const request = require('request').defaults({jar: true}); 

// Or by setting it on each request 
request('www.example.com', { jar: true }); 
+0

Cette façon de procéder fonctionne pour moi, habituellement je l'ai seulement défini par défaut comme 'var request = request.defaults ({jar: true})' – Lai32290