【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);