PearにはAuthという認証専用のモジュールがあります。
ログイン時の認証を行う場合、結構便利に使用することができます。

このAuthで認証したページからリダイレクトで別のページに移動したときに、前ページで認証した情報が保持できない現象が発生しました。プログラムは以下の通りで、test1.phpで認証を行い、認証された場合はtest2.phpへ移動するというものです。

test1.php


require_once "Auth.php";
$options = array(
      'dsn'=>"mysql://username:password@hostspec/database",
      'table'=>"table",
      'usernamecol'=>"username",
         'passwordcol'=>"password",
         'cryptType'=>"md5",
         'db_fields'=>'*'
);
$a = new Auth("DB", $options);
$a->start();
if ($a->checkAuth()) {
        header('location:http://localhost/test2.php');
        exit();
}
    exit("test1.php NG");

test2.php

 require_once "Auth.php";
 $options = array(
         'dsn'=>"mysql://username:password@hostspec/database",
         'table'=>"table",
         'usernamecol'=>"username",
         'passwordcol'=>"password",
         'cryptType'=>"md5",
         'db_fields'=>'*'
);
$a = new Auth("DB", $options);
$a->start();
if ($a->checkAuth()) {
        exit("test2.php OK");
}
exit("test2.php NG");

このプログラムをhttp://192.168.0.1/test1.phpにアクセスします。

Pear Auth 1

上記画面のような認証画面が表示されるのでUsernameとPasswordを入力し、[Login]をクリックします。すると通常認証されると

test2.php OK

だけが表示されるのですが、test1.phpと同じ認証画面が表示されます。

Pear Auth 2
もちろん、UsernameとPasswordに間違いは無いものとします。

なぜ、認証されているのにtest2.phpでは認証を求める画面が表示されるかというと、test1.phpのURLとリダイレクトをするURLが異なるために、このような現象が発生します。

http://localhost/test1.php

http://192.168.0.1/test1.php

は同じアドレスなのですが、この様なアドレスの違いで認証ができなくなるようです。

なかなか分かりにくいことなのですが、気がつくと「な〜んだ」ということが多々あります。