【Apache/PHP】Digest認証用の.htdigest を生成する

【Apache/PHP】Digest認証用の.htdigest を生成する

一年前から使っていた NIKE+ FUELBAND SE を無くしてしまいました。「Apple Watchを買いなさい」という啓示に違いない、と思っている、ポジティブシンキング?のtanakaです。でも初代は見送ろうと思ってます。

今日の記事では社内用ツールとして、Digest認証に必要なファイル生成を実装する機会があったので、実装コードをご紹介します。実装前は作り方を知らなかったため、htdigest コマンドを実行してしまえばいいかな…と考えていましたが、簡単だったのでPHPで実装してみました。

PHPコード(generate_digest_auth.php)


<?php
/**
 * .htdigest 用の1つ1つの行を生成する …(1)
 * @param $userName
 * @param $password
 * @param $realm
 * @return string
 */
function createDigestAuthEntry( $userName, $password, $realm )
{
    $passwordHash = md5(sprintf('%s:%s:%s', $userName, $realm, $password));
    return sprintf('%s:%s:%s', $userName, $realm, $passwordHash);
}

/**
 * .htdigest ファイルを保存する …(2)
 * @param $rawAuthInfos
 * @param $realm
 * @param $filePath
 * @return int
 */
function saveHtdigest( $rawAuthInfos, $realm, $filePath)
{
    $digestAuthEntries = array();
    foreach ($rawAuthInfos as $userName => $password) {
        $digestAuthEntries[] = createDigestAuthEntry($userName, $password, $realm);
    }
    return file_put_contents($filePath, implode("\n", $digestAuthEntries) . "\n");
}

/**
 * .htaccess ファイルを保存する …(3)
 * @param $realm
 * @param $filePath
 * @param $htdigestFilePath
 * @return int
 */
function saveHtaccess( $realm, $filePath, $htdigestFilePath)
{
        $htaccessContents = <<<HTACCESS
AuthType Digest
AuthName "{$realm}"
AuthUserFile {$htdigestFilePath}
Require valid-user

HTACCESS;
    return file_put_contents($filePath, $htaccessContents);
}

// 使い方サンプル …(4)

// IDと平文のパスワード
$rawAuthInfos = array(
    'user1' => 'password1',
    'user2' => 'password2',
);
// 認証領域
$realm = 'Please input ID and Password.';
$filePathHtdigest = '/var/www/html/hoge/.htdigest';
$filePathHtaccess = '/var/www/html/hoge/.htaccess';

saveHtdigest($rawAuthInfos, $realm, $filePathHtdigest);
saveHtaccess($realm, $filePathHtaccess, $filePathHtdigest);

上から順番に

  • (1) createDigestAuthEntry() .htdigest 用エントリー(1行)を生成する
  • (2) saveHtdigest() .htdigest ファイルを保存する
  • (3) saveHtaccess() .htaccess ファイルを保存する
  • (4) 関数を使うサンプル

です。実装の肝はcreateDigestAuthEntry関数です。.htdigest ファイルを生成するには、ユーザ名、パスワードの他にrealm(認証領域)と呼ばれる文字列が必要です。このrealmは、ブラウザの認証ダイアログに表示される文字列と一緒で.htaccessにも保存します。以下のコードで .htdigest 用の1行を生成します。


    $passwordHash = md5(sprintf('%s:%s:%s', $userName, $realm, $password));
    return sprintf('%s:%s:%s', $userName, $realm, $passwordHash);

参考文献

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ