揮発性のメモ2

知識をメモ書きしておく

PHPでBASIC認証を受け付ける。 wgetでテストする。

これの焼き直し
www.php.net

BASIC認証の基本的な動き

基本的に、BASIC認証は2回アクセスが来る。
1回目は認証なし。サーバは一旦 401 で突っ返す。 2回目でBASIC認証が来る。

BASIC認証ではリクエストヘッダに Authorization が追加される

Authorization:Basic SE9HRTpQSVlP

ユーザ名 HOGE, パスワード PIYO がBASE64エンコードされている。

PHPでの基本的な書き方

PHPでは、BASIC認証時に次の変数が追加される

<?
$_SERVER['HTTP_AUTHORIZATION'] = 'Basic SE9HRTpQSVlP';
$_SERVER['PHP_AUTH_USER'] = 'HOGE';
$_SERVER['PHP_AUTH_PW'] = 'PIYO';

ユーザ名とパスワードがデコードされてて助かる。

<?
$user = $_SERVER['PHP_AUTH_USER'] ?? "";
$pass = $_SERVER['PHP_AUTH_PW'] ?? "";
if( $user=="" ){
    header('WWW-Authenticate: Basic realm="My Realm"');
    header('HTTP/1.1 401 Authorization Required');
    echo "ERROR: OTOTOI KIYAGARE");
    exit(1);
}
if( authcheck($user, $pass) ){

WWW-Authenticate: Basic realm="My Realm" を返すのが重要。 リクエスト側は認証の種類がBASIC認証であることがわからないので アホになってしまう。
もうむしろ 401 を自分で返さなくてもよい(なんか勝手に401と解釈される)

wgetでのテスト

wget --http-user="HOGE" --http-password="PIYO" http://192.168.1.78/hoge.php

引数に ユーザ名とパスワードをつけると、BASIC認証してくれる。
1回目は認証なしでアクセスし、2回目でBASIC認証する。

wget --auth-no-challenge --http-user="HOGE" --http-password="PIYO" http://192.168.1.78/hoge.php

--auth-no-challenge をつけることで、1回目からBASIC認証にいってくれる。