web-dev-qa-db-fra.com

Comment maintenir une session de demande dans NodeJS

J'essaie d'utiliser NodeJS pour gratter un site Web qui nécessite une connexion par POST. Ensuite, une fois connecté, je peux accéder à une page Web distincte par GET.

Le premier problème en ce moment est la connexion. J'ai essayé d'utiliser request pour POST les informations de connexion, mais la réponse que j'obtiens ne semble pas être connectée.

exports.getstats = function (req, res) {
    request.post({url : requesturl, form: lform}, function(err, response, body) {
        res.writeHeader(200, {"Content-Type": "text/html"});
        res.write(body);
        res.end();
    });
};

Ici, je ne fais que transférer la page que je récupère, mais la page que je récupère affiche toujours le formulaire de connexion, et si j'essaie d'accéder à une autre page, il indique que je ne suis pas connecté.

Je pense que je dois conserver les données de session et de cookie côté client, mais je ne trouve aucune ressource pour m'aider à comprendre comment le faire.


En guise de suivi, j'ai fini par utiliser zombiejs pour obtenir les fonctionnalités dont j'avais besoin

34
Ryan

Vous devez créer un pot de cookies et utiliser le même pot pour toutes les demandes associées.

 var cookieJar = request.jar();
 request.post({url : requesturl, jar: cookieJar, form: lform}, ...

Cela devrait en théorie vous permettre de gratter des pages avec GET en tant qu'utilisateur connecté, mais seulement une fois que le code de connexion réel fonctionne. Sur la base de votre description de la réponse à votre POST de connexion, cela ne fonctionne peut-être pas encore correctement, donc le pot de cookies ne vous aidera pas tant que vous n'aurez pas résolu les problèmes dans votre code de connexion.

43
Peter Lyons

La request.jar(); ne fonctionnait pas pour moi. J'utilise donc la réponse des en-têtes pour faire une autre demande comme celle-ci:

request.post({
    url: 'https://exampleurl.com/login',
    form: {"login":"xxxx", "password":"xxxx"}
}, function(error, response, body){

    request.get({
        url:"https://exampleurl.com/logged",
        header: response.headers
    },function(error, response, body){
        // The full html of the authenticated page
        console.log(body);
    });
});

En fait, cette méthode fonctionne bien. = D

12
Henrique Rotava