2012-04-11 6 views
25

Ich versuche, eine Webseite zu öffnen, die HTTP-Authentifizierung in PhantomJS erfordert. Mein Skript wird das loadspeed.js Beispiel basiert weg:PhantomJS sendet keine Authentifizierung Header

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

ich aus dem gerenderten page.jpg sehen kann, dass ich jedes Mal ein 401 bin immer. Ich habe auch die HTTP-Sitzung mit Wireshark verfolgt, die offenbart, dass kein Authentifizierungsheader in der GET-Anfrage an die angegebene URL gesendet wird.

Was mache ich hier falsch? Ich fange gerade mit PhantomJS an, aber ich habe den ganzen Abend gesucht und bin nicht weit gekommen ...

+0

Welcher Browser? Chrome 19 erlaubt Ihnen nicht, eine XHR-Einstellung vorzunehmen, die den Benutzernamen und das Passwort festlegt. Dies wurde verursacht, als der Benutzername: password @ Anteil der URLs nicht zugelassen wurde. HTTP Auth gegen eine andere Website ist ein kniffliges Geschäft. Ich schätze, ich werde nächstes Wochenende einen Blog über dieses Thema schreiben. – panzi

+0

Nicht direkt mit dieser Frage zu tun, aber ich möchte darauf hinweisen, dass ab PhantomJS 1.9.2 und SlimerJS 0.8.4 Ihre Authentifizierungsinformationen (egal ob mit 'page.settings' oder' page.customHeaders') gesendet werden alle Server von Drittanbietern, auf die auf dieser Seite verwiesen wird. (Wenn z. B. die Seite, auf der Sie sich anmelden, ein CDN für ihre jQuery verwendet, erhält dieser CDN-Server Ihren Benutzernamen und Ihr Passwort; ähnlich für Ad-Server.) SlimerJS arbeitet zumindest an einer Lösung. –

Antwort

31

PhantomJS (mindestens ab 1.9.0) hat einen Fehler mit Auth: Es sendet die Anfrage ohne die Auth-Header, und dann erst, nachdem es die 401 zurück bekommt, tut es die Anfrage aber diesmal mit den Headern . (Das ist für GET, POST mit ihm überhaupt nicht funktionieren.)

Die Abhilfe ist einfach, so statt:

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

können Sie:

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

(I nur in einem Blog-Post: http://darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html, und lernte, dass Workaround auf der PhantomJS Mailing-Liste von Igor Semenko.)

+0

PhantomsJS 1.9.1 brauchte die Problemumgehung auf meinem Computer nicht. –

+0

PhantomJS 1.9.2 auf meiner Maschine verhält sich unregelmäßig. 'page.settings.userName' und' password' funktionieren manchmal, manchmal nicht. Es ist wahrscheinlich nicht mit der fehlenden 401-Stufe verbunden, weil ich die ganze Zeit mit demselben Remote-Server arbeite. Mit customHeader - scheint immer zu funktionieren. – quetzalcoatl

+0

Diese Frage ist so alt, dass ich keine Ahnung habe, welche phantomJS-Version ich benutzte, aber vermutlich hatte sie einige Abweichungen von diesem Fehler. –

7

Ich denke nicht, dass irgendetwas mit dem Skript falsch ist, das Ihr verwendet oder phantomjs (mindestens in v1.5).

Wenn Sie dieses Skript versuchen:

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

Die Auth ist erfolgreich.