web-dev-qa-db-ja.com

PhantomJSが認証ヘッダーを送信しない

PhantomJSで、HTTP認証を必要とするWebページを開こうとしています。私のスクリプトは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();
  });
}

レンダリングされたpage.jpgから、毎回401を取得していることがわかります。 Wiresharkを使用してHTTPセッションをトレースしたところ、GETリクエストで指定のURLに認証ヘッダーが送信されていないことがわかりました。

ここで何が悪いのですか?私はPhantomJSを使い始めたばかりですが、私は一晩中探していましたが、遠くはありませんでした...

26
Karl Barker

PhantomJS(少なくとも1.9.0以降)にはauthのバグがあります。authヘッダーなしでリクエストを送信し、401を取得した後にのみ、ヘッダーを使用してリクエストを再実行します。 (これはGETの場合です。POSTの場合、まったく機能しません。)

回避策は簡単なので、代わりに:

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

あなたは使うことができます:

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

(私はこれをブログ記事で取り上げました: http://darrendev.blogspot.jp/2013/04/phantomjs-post-auth-and-timeouts.html 、そしてPhantomJSでその回避策を学びましたIgor Semenkoからのメーリングリスト。)

34
Darren Cook

私が使用しているスクリプトまたはphantomjsに問題があるとは思いません(少なくともv1.5では)。

このスクリプトを試した場合:

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

認証は成功しました。

7
Dve