web-dev-qa-db-fra.com

Passer le cookie dans le cadre de la requête node.js

J'utilise le package request pour créer mes requêtes côté serveur. J'ai écrit un middleware d'authentification qui vérifie un identifiant de cookie/session pour toutes les demandes. Par conséquent, existe-t-il un moyen d'inclure le cookie de l'utilisateur dans le cadre de la demande? Voici mon code actuel:

var cookie = parseCookie.parseCookie(req.headers.cookie);

request('http://localhost:3000/users/api', function(error, response, body) {
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login
    res.render('../views/admin');
});

Actuellement, cela renvoie "aucun cookie trouvé" dans la console. Cependant, si je désactive mon middleware d'authentification, le code ci-dessus fonctionne comme prévu.

Information additionnelle:

Le cookie que je veux est le cookie de l'utilisateur final situé sur le navigateur. Le cookie de l'utilisateur final est créé par l'application chaque fois que l'utilisateur se connecte.

Mise à jour - tentative de solution 1:

J'ai essayé cela à partir de la documentation:

var cookie = parseCookie.parseCookie(req.headers.cookie);
var cookieText = 'sid='+cookie;
var j = request.jar();
        var cookie = request.cookie(cookieText);
        var url = 'http://localhost:3000/users/api';
        j.setCookie(cookie, url);
        request({url: url, jar: j}, function(error, response, body) {
            request('http://localhost:3000/users/api');
        });

Cependant, la console renvoie toujours "aucun cookie trouvé"

Quelqu'un peut-il aider?

Merci d'avance!

12
Trung Tran

Laissez-moi vous expliquer les cookies et cela vous montrera probablement pourquoi il est difficile d'obtenir le cookie que vous souhaitez.

  1. Lorsque le navigateur de votre utilisateur se connecte à http://localhost:3000, ce serveur crée un cookie de connexion et le renvoie dans le cadre de la réponse de connexion.
  2. Lorsque le navigateur reçoit ce cookie, il enregistre ce cookie de manière permanente dans le navigateur et associe ce cookie au http://localhost:3000 domaine et port.
  3. Lorsque l'utilisateur fait à nouveau une demande à http://localhost:3000, le navigateur envoie tous les cookies qu'il a précédemment enregistrés pour ce domaine et ce port particuliers avec la demande au serveur.
  4. Lorsque le serveur reçoit la demande, il peut examiner tous les cookies envoyés avec la demande.
  5. Lorsque le navigateur envoie ensuite une demande à un autre serveur ou même au même serveur, mais sur un port différent, le navigateur n'envoie PAS les cookies précédemment enregistrés avec cette demande car ces cookies appartiennent à un serveur et à un port différents. Le navigateur met tout en œuvre pour envoyer des cookies uniquement aux serveurs auxquels appartiennent les cookies. Étant donné que les cookies fournissent souvent un accès à la connexion, vous pouvez clairement comprendre pourquoi il est important que des éléments tels que les cookies de connexion ne soient pas envoyés aux serveurs vers lesquels ils ne devraient pas être envoyés.

Maintenant, passons à votre code node.js. Vous montrez un bloc de code node.js qui essaie d'accéder au même http://localhost:3000 serveur. Mais, les cookies sont stockés dans le navigateur de l'utilisateur. Votre code node.js ne peut pas les obtenir du navigateur car le navigateur les protège et ne les révélera que lorsque le navigateur lui-même envoie une demande à http://localhost:3000.


Si vous avez réellement le bon cookie dans votre code node.js, vous pouvez le définir sur votre demande comme ceci:

request({url: 'http://localhost:3000/users/api', headers: {Cookie: somedataHere}}, function(error, response, body) {
    console.log(body); //this console.logs my login page since requests w/o valid cookies get redirected to login
    res.render('../views/admin');
});

La documentation pertinente pour les en-têtes personnalisés dans le module request est ici .

20
jfriend00

Répondre:

var cookie = parseCookie.parseCookie(req.headers.cookie);
var cookieText = 'sid='+cookie;
var options = {
  url: 'https://api.github.com/repos/request/request',
  headers: {
   'User-Agent': 'request'.
   'Host': 'localhost:3000',
   'cookie': cookieText //this is where you set custom cookies
  }
};

function callback(error, response, body) {
  if (!error && response.statusCode == 200) {
    var info = JSON.parse(body);
    console.log(info.stargazers_count + " Stars");
    console.log(info.forks_count + " Forks");
  }
}

request(options, callback);
6
Trung Tran