Question PhantomJS n'envoie pas d'en-tête d'authentification


J'essaie d'ouvrir une page Web qui requiert une authentification HTTP, dans PhantomJS. Mon script est basé sur l'exemple loadspeed.js:

var page = require('webpage').create(),
    t, address;
page.settings.userName = "user";
page.settings.password = "password";
if (phantom.args.length === 0) {
  console.log('Usage: loadspeed.js <some URL>');
  phantom.exit();
} else {
  t = Date.now();
  address = phantom.args[0];
  page.open(address, function (status) {
      if (status !== 'success') {
          console.log('FAIL to load the address');
      } else {
          t = Date.now() - t;
          console.log('Loading time ' + t + ' msec');
          page.render('page.jpg');
      }
      phantom.exit();
  });
}

Je peux voir sur le rendu page.jpg que je reçois un 401 à chaque fois. J'ai également tracé la session HTTP en utilisant Wireshark, qui révèle qu'aucun en-tête d'authentification n'est envoyé dans la requête GET à l'URL donnée.

Que fais-je mal ici? Je commence à peine avec PhantomJS mais j'ai cherché toute la soirée et je ne suis pas allé loin ...


25
2018-04-11 22:32


origine


Réponses:


PhantomJS (au moins à partir de 1.9.0) a un bug avec auth: il envoie la requête sans les en-têtes d'authentification, et seulement après avoir récupéré le 401, il recommence la requête mais cette fois avec les en-têtes. (C'est pour GET; avec POST ça ne marche pas du tout)

La solution de contournement est simple, au lieu de:

page.settings.userName = 'username';
page.settings.password = 'password';

vous pouvez utiliser:

page.customHeaders={'Authorization': 'Basic '+btoa('username:password')};

(Je viens de couvrir cela dans un article de blog: http://darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html, et a appris cette solution sur la liste de diffusion PhantomJS d'Igor Semenko.)


33
2018-04-11 03:43



Je ne pense pas qu'il y ait quelque chose de mal avec le script que vous utilisez ou phantomjs (au moins dans la version 1.5).

Si vous essayez ce script:

var page = require('webpage').create(),
    system = require('system'),
    t, address;

page.settings.userName = 'test';
page.settings.password = 'test';

if (system.args.length === 1) {
    console.log('Usage: loadspeed.js <some URL>');
    phantom.exit();
} else {
    t = Date.now();
    address = system.args[1];
    page.open(address, function (status) {
        if (status !== 'success') {
            console.log('FAIL to load the address');
        } else {
            t = Date.now() - t;
            console.log('Page title is ' + page.evaluate(function () {
                return document.title;
            }));
            console.log('Loading time ' + t + ' msec');
        }
        phantom.exit();
    });
}

phantomjs loadspeed.js http://browserspy.dk/password-ok.php

L'authentification est réussie.


7
2018-05-23 09:20