Web アプリケーション向けの HTTP 認証の実装
Apache モジュール (mod_csp*.so/dll および CSPa*[Sys].so/dll) により、HTTP 認証を InterSystems IRIS® で制御できます。
Web 要求の HTTP 認証は、通常、Web サーバとクライアント (ブラウザ) の間で行われます。このため、CGI プログラムや Web サーバの API をベースにした要求ハンドラなど、Web サーバによりホストされるカスタム要求ハンドラに HTTP 認証を実装することはできません。もちろん、このような拡張機能で 401 Authorization Required 応答ヘッダを発行することができます。これに対して、ブラウザには HTTP ログイン・ダイアログが表示されます。ただし、それ以降の要求では、Web サーバはユーザ・ログインの詳細を傍受し、独自の組み込み機能を使用してユーザ認証を試みます。Web サーバが独自の方法でユーザを認証するまで、少なくとも、最初のインスタンスでは、ユーザ名とパスワードが要求処理拡張機能に渡されることはありません。
このスキーマは、サードパーティ開発技術 (CSP など) を使用して、その技術の範囲内でローカルに (プログラムによって) HTTP 認証を実行しようとしているユーザにとっては問題となります。
ここで説明した機能により、これらの技術的問題は解決されているため、ユーザは InterSystems IRIS 環境で Apache のホストする Web アプリケーションに対して HTTP 認証を実行できるようになります。Apache ユーザは、これ以降のセクションで説明する 3 つのアプローチから選択できます。
Apache での標準 HTTP 認証 (mod_auth)
この方法は、Apache により (mod_auth モジュール経由で) 提供される標準メカニズムで、Web ゲートウェイは使用しません。ここでは、完全を期すために説明しています。
Apache ベースの認証を使用する CSP サンプルを保護するために必要な基本パラメータの例は、以下の構成ブロック (httpd.conf) のとおりです。
<Location "/csp/samples/">
AuthType Basic
AuthName "CSP samples"
AuthUserFile conf/csp.pwd
require valid-user
</Location>
以下はその説明です。
AuthType は要求された認証タイプ (通常は Basic) です。
AuthName はレルムです。
AuthUserFile はユーザ名とそれに関連付けられたパスワードを (暗号化された形で) 保持するファイル (Web サーバのルートとの相対パスで表されたもの) です。このファイルは、Apache htpasswd ユーティリティで作成され、管理されます。
require パラメータは、保護されたリソース (この場合は CSP サンプル) にアクセスが許可されたユーザのリストです。valid-user 引数は、ユーザを (AuthUserFile で宣言されたとおり) ユーザ名/パスワード・ファイルで定義する必要があることを示します。
Apache は、ユーザ 'groups' にグループ化されるユーザに対応しています。詳細は、AuthGroupFile 指示文を参照してください。
https://httpd.apache.org/docs/2.4/mod/mod_authz_groupfile.html#authgroupfile
要求の処理と同時に CSP で行われる認証
これは、Web アプリケーションでの HTTP 認証の実装に推奨される (また、最もパフォーマンスのよい) メソッドです。
CSP ベースの認証を使用する CSP サンプルを保護するために必要な基本パラメータは、以下の Apache 構成ブロック (httpd.conf) のとおりです。
<Location "/csp/samples/">
AuthType Basic
AuthName "CSP samples"
require valid-user
AuthCSPEnable On
AuthBasicAuthoritative Off
</Location>
パラメータ AuthType、AuthName、および require は認証のトリガに使用される標準 Apache パラメータです。
また、追加の AuthCSPEnable パラメータは、(mod_auth で) Apache により行われる認証チェックを迂回し、本来の Web 要求と共にユーザ名とパスワードを認証のために InterSystems IRIS に渡すように CSP モジュールに指示します。Web アプリケーションは、以下の CGI 環境変数を使用して、このユーザをチェックする必要があります。
-
AUTH_TYPE : これは Basic です。
-
REMOTE_USER : ユーザ名。
-
AUTH_PASSWORD : ユーザのパスワード (プレーン・テキスト)。
これらのパラメータに保持された値に基づいて、ユーザが正常に認証されると、アプリケーションは要求の処理を続行します (つまり、要求された CSP リソースを返します)。認証されなかった場合、最低でも次のような HTTP 401 Authorization Required 応答が返されます。
HTTP/1.1 401 Authorization Required
WWW-Authenticate: Basic realm="CSP samples"
Content-Type: text/html
Connection: close
<html>
<head><title>401 Authorization Required</title>
</head><body> <h1>Authorization Required</h1>
<p> The server could not verify that you are authorized
to access the application. Check your username and password.
</p>
<hr>
</body>
</html>
このメッセージが受信されると、ユーザが既定の回数 (通常は 3 回) を超えてログインを試行していない限り、ブラウザにはログイン・ダイアログが再表示されます。超えてしまった場合は、ヘッダに続いてこのメッセージが表示されます。
この認証方法は、ログイン・ページを変更することで実装できます。要求が到着したときに、アプリケーションを実行するために必要な権限をユーザが保持していなかった場合、ログイン・ページが呼び出され、要求から認証情報 (AUTH_TYPE、REMOTE_USER、AUTH_PASSWORD など) を抽出する処理が行われます。これらのパラメータが正当と判断された場合、ログイン・スクリプトは、本来要求されたアプリケーション・ページに制御をリダイレクトします。InterSystems IRIS セキュリティのコントロール・レイヤが展開されている場合、パブリック・ページすべてに対してこの認証プロシージャを繰り返す必要はありません。
要求の処理前に CSP で行われる認証
これは、InterSystems IRIS で HTTP 認証を実装するための代替方法です。これは主に、Web アプリケーションでの要求処理時には認証を実行することが難しいか、実行に時間がかかる場合に行われます。
この方法では、ユーザ認証のために、専用の認証クラスが呼び出されます。Web ゲートウェイは、InterSystems IRIS に元の要求を送信する前に、このチェックを実行します。認証クラスによるユーザの詳細チェックが正常に終了すると、これ以上、Web アプリケーションでチェックを実行する必要はありません。
もちろん、この方法には、Web 要求 1 回に対して、認証に 1 回、CSP リソースに対する実際の要求の処理に 1 回の合計 2 回 (InterSystems IRIS への) 要求を処理するというオーバーヘッドがあります。
この認証方法を実装するために必要な基本パラメータは、以下の Apache 構成ブロック (httpd.conf) のとおりです。
<Location "/csp/samples/">
AuthType Basic
AuthName "CSP samples"
require valid-user
AuthCSPEnable On
AuthCSPClass /csp/samples/%CSP.HTTPAuthentication.cls
AuthBasicAuthoritative Off
</Location>
パラメータ AuthType、AuthName、require、および AuthCSPEnable はメソッド (2) と同じです。
また、AuthCSPClass パラメータはユーザ認証を実行するクラスを定義します。このクラスは、適切な CGI 環境変数を使って %CSP.PageOpens in a new tab を拡張し、ユーザ・ログインの詳細をチェックして、操作に成功した場合は 200 OK 応答ヘッダ、失敗した場合は 401 Authorization Required 応答ヘッダを返す必要があります。
%Users ファイルに保存されているレコードに対するユーザ・ログインの詳細のチェックが行われる単純な認証クラスは以下のとおりです。
Class %CSP.HTTPAuthentication Extends %CSP.Page
{
ClassMethod OnPreHTTP() As %Boolean
{
Set %response.ContentType = "text/html"
Set %session.Preserve = 0
Quit 1
}
ClassMethod OnPage() As %Status
{
Set crlf=$Char(13,10)
Set type=%request.GetCgiEnv("AUTH_TYPE", "")
Set user=%request.GetCgiEnv("REMOTE_USER", "")
Set pwd=%request.GetCgiEnv("AUTH_PASSWORD", "")
Set httpauth=%request.GetCgiEnv("HTTP_AUTHORIZATION", "")
If httpauth'="" {
Set type=$Piece(httpauth," ",1)
Set user=$system.Encryption.Base64Decode($Piece(httpauth," ",2))
Set pwd=$Piece(user,":",2)
Set user=$Piece(user,":",1)
}
Set auth=0
If $ZConvert(type,"L")'="basic" Set auth=1
If auth=0,user'="",$Get(^%Users(user))=pwd Set auth=1
If auth=1 {
Write "HTTP/1.1 200 OK"_crlf
Write "Content-Type: text/html"_crlf
Write "Content-Length: 0"_crlf
Write "Connection: close"_crlf_crlf
}
Else {
Write "HTTP/1.1 401 Authorization Required"_crlf
Write "WWW-Authenticate: Basic realm=""CSP samples"""_crlf
Write "Content-Type: text/html"_crlf
Write "Content-Length: 0"_crlf
Write "Connection: close"_crlf_crlf
}
Quit $$$OK
}
ClassMethod OnHTTPHeader(ByRef OutputBody As %Boolean) As %Status
{
Quit $$$OK
}
}
メソッド (1) および (3) では、Apache ErrorDocument 指示文を使用して、ログインの失敗に対するカスタム・エラー・ページを指定できます。以下はその例です。
ErrorDocument /error/my_authentication_error.html
もちろん、メソッド (2) では、エラー・メッセージの内容は Web アプリケーションによって制御されます。