2012-04-11 9 views
25

Sto tentando di aprire una pagina Web che richiede l'autenticazione HTTP, in PhantomJS. Il mio script è basato l'esempio loadspeed.js:PhantomJS non invia l'intestazione di autenticazione

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(); 
    }); 
} 

posso vedere dalla page.jpg reso che sto ricevendo un 401 ogni volta. Ho anche tracciato la sessione HTTP utilizzando Wireshark, che rivela che nessuna intestazione di autenticazione viene inviata nella richiesta GET all'URL specificato.

Cosa sto facendo di sbagliato qui? Sto appena iniziando con PhantomJS ma ho cercato tutta la sera e non sono andato lontano ...

+0

Che browser? Chrome 19 non consente semplicemente di impostare XHR come nome utente e password. Ciò è stato causato quando hanno impedito il nome utente: password @ percentuale di URL. L'autenticazione HTTP contro un sito Web diverso è un lavoro complicato. Immagino che scriverò un blog su questo argomento il prossimo fine settimana o giù di lì. – panzi

+0

Non fare direttamente con questa domanda, ma voglio sottolineare che a partire da PhantomJS 1.9.2 e SlimerJS 0.8.4, le tue informazioni di autenticazione (fatte con 'page.settings' o' page.customHeaders') vengono inviate a tutti i server di terze parti a cui si fa riferimento in quella pagina. (Ad esempio, se la pagina in cui si effettua l'accesso utilizza un CDN per il proprio jQuery, allora il server CDN ottiene il nome utente e la password, analogamente per gli ad server.) SlimerJS, almeno, sta lavorando a una soluzione. –

risposta

31

PhantomJS (almeno dalla versione 1.9.0) ha un bug con auth: invia la richiesta senza le intestazioni auth e solo dopo aver ottenuto il 401 indietro esegue nuovamente la richiesta ma questa volta con le intestazioni . (Questo è per GET, POST con non funziona affatto.)

La soluzione è semplice, così invece di:

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

è possibile utilizzare:

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

(I ho appena trattato questo in un post del blog: http://darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html e ho appreso che la soluzione alternativa alla mailing list PhantomJS di Igor Semenko.)

+0

PhantomsJS 1.9.1 non ha richiesto la soluzione alternativa sul mio computer. –

+0

PhantomJS 1.9.2 sulla mia macchina si comporta in modo irregolare. 'page.settings.userName' e' password' a volte funzionano, a volte no. Probabilmente non è correlato allo stadio 401 mancante, perché lavoro sempre con lo stesso server remoto. Con customHeader - sembra funzionare sempre. – quetzalcoatl

+0

Questa domanda è così vecchia che non ho idea di quale versione di phantomJS stavo usando, ma presumibilmente aveva qualche variazione su questo bug. –

7

Non penso che ci sia qualcosa di sbagliato nello script che usi o phantomjs (almeno nella v1.5).

Se si tenta questo 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'autenticazione è riuscita.

Problemi correlati