こんにちは、鯨井貴博@opensourcetechです。
本記事は、
nginx1.7.9によるメールプロキシ on CentOS6.6 - Opensourcetechブログ
にて使用したauth.phpの解説となります。
auth.phpの内容
<?php
if (!isset($_SERVER["HTTP_AUTH_USER"] ) || !isset($_SERVER["HTTP_AUTH_PASS"] )){
fail();
・・・Nginxから送信されるHTTPヘッダー情報から、
Auth-UserとAuth-Passの有無を確認し、
なければfunction failを実行します。
あれば、次に進みます。
_SERVERはグローバル変数。
}
$username=$_SERVER["HTTP_AUTH_USER"] ;
$userpass=$_SERVER["HTTP_AUTH_PASS"] ;
$protocol=$_SERVER["HTTP_AUTH_PROTOCOL"] ;
・・・各変数にNginxから送信されるAuth-User・Auth-Pass・Auth-Protocolを格納します。
$backend_port=110;
if ($protocol=="imap") {
$backend_port=143;
}
if ($protocol=="smtp") {
$backend_port=25;
}
・・・変数protocolに入るプロトコルによって、
変数backend_portに格納するポート番号を変えるif(条件)文
$backend_ip["mail.kujirai.test.local"] ="127.0.0.1";
・・・変数backend_ipに127.0.0.1を代入
if (!authuser($username,$userpass)){
fail();
exit;
}
・・・function authuserに変数usernameとuserpassを代入し、
trueでなければfunction failを実行します。
$userserver=getmailserver($username);
・・・変数userserverにfunction getmailserverの内容を格納します。
$server_ip=(isset($backend_ip[$userserver]))?$backend_ip[$userserver] :$userserver;
pass($server_ip, $backend_port);
・・・$backend_ip[$userserver]が真(?)なら$backend_ip[$userserver] を、
偽(:$)ならuserserverを代入。
pass($server_ip, $backend_port)
・・・function passに変数server_ipとbackend_portを当てはめて実行する。
function authuser($user,$pass){
return true;
}
・・・変数userとpassが合っていれば、
trueを返すfunction authuser
function getmailserver($user){
return "mail.kujirai.test.local";
}
・・・「mail.kujirai.test.local」を返すgetmailserverというfunction
function fail(){
header("Auth-Status: Invalid login or password");
exit;
}
・・・failというfunctionの定義
header関数で、「Auth-Status: Invalid login or password」という
ヘッダー情報を送信します。
function pass($server,$port){
header("Auth-Status: OK");
header("Auth-Server: $server");
header("Auth-Port: $port");
exit;
・・・Auth-Status: OK、Auth-Server: $server、Auth-Port: $portをヘッダー情報として
応答する。
}
?>
以下のパケットキャプチャから、
Nginxからauth.php(apache)でやり取りされるヘッダーじゅほうが確認出来ます。