Digest認証環境でもTestcafeしたい!(ラノベ)
対象バージョン
Testcafe Ver.0.13.0 でもTestcafeあんまり関係ないよ だいたいApacheだよ
ここまでのあらすじ
営業氏「プロジェクトのステージング環境をデモサイトとしても使用したい」
↓
じゃあ外部にも公開しよう
↓
ステージングサイトに無制限にアクセスされるとマズいから、Digest認証をかけましょう
↓
そういえばDigest認証のページに対してTestcafeって動くのかな
↓
401 Not Authorized/(^o^)\
↓
TestcafeのAPIにhttp認証のAPIあるやんけ。使ったろ(https://devexpress.github.io/testcafe/documentation/test-api/http-authentication.html)
↓
401 Not Authorized(Basic Authentication Only)\(^o^)/
↓
あれ……コレは自動テスト化の夢が潰えるのでは……?←今ここ
そもそもなぜBasic認証できてDigest認証できないのか
調べてみたところ、UI上は同じだが、暗号化の方法が違うらしい。 また、それに伴ってHTTP Headerの中身もゴッソリ変わってしまう模様。 (http://dackdive.hateblo.jp/entry/2014/06/24/220557)
これに合わせてTestcafeを魔改造し、Digest認証に対応させるのも手だが、今後アップデートされた際に地獄を見るのは明らかなので、違う手を打ってみる。
結論
Digest認証が通らないのなら、Digest認証を外してしまえばいいじゃない。
というわけで、手の一つとしてBasic認証にしてしまう手があります。 とはいえ、暗号化方式としてはDigest認証の方が強固なため、やはりDigest認証の方を採用したいところ。
それなら特定の場所に絞ってDigest認証をかけてしまえばいいじゃない。 大枠の方針としては以下の通り。
- 基本的には認証を持っていないユーザーはdenyする。
- 特定のIP(弊社のグローバルIP)からのアクセスのみallowする。
これらの方針を、Apacheのコンフィグファイルを利用して実装します。
実装例
まずは通常のDigest認証のユーザーとパスワードを生成
cd /path/to/apache/bin htdigest -c "/path/to/digest/config/file/<digest pass setting file name>" <Digest Auth Name> <User Name>
パスワードが要求されるので、認証に利用したいパスワードを入力します
New password:******* Re-Type new password: *******
htdigestで設定した場所に、暗号化された認証ファイルが作成されます。
続いて、認証で守りたいフォルダを設定します。
httpd.conf
<Directory "/path/to/auth/folder"> AuthType Digest AuthName "<Digest Auth Name>" AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>" Require valid-user </Directory>
また、Digest認証に利用するモジュールをロードするようにしておきます。
httpd.conf
LoadModule asis_module modules/mod_asis.so LoadModule auth_basic_module modules/mod_auth_basic.so #LoadModule auth_digest_module modules/mod_auth_digest.so ←コメントを外す #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so
ここまででDigest認証の準備は完了。 設定したユーザーIDとパスワードで認証がかかっているかどうかを確認します。
続いて、特定IPのホワイトリストを作るために、先ほど設定したDirectoryにプロパティを追加します。
httpd.conf
<Directory "/path/to/auth/folder"> AuthType Digest AuthName "<Digest Auth Name>" AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>" Require valid-user ## ----ここから下を追加---- ## Satisfy Any Order deny,allow deny from all Allow from <Test Client Global IP> </Directory>
ホワイトリストには会社のIPとか入れておけばいいんじゃないでしょうか。 あとは他にテスト利用したい場所に向けてIPを順次解放していく形。
Tomcat併用環境だとダメだった
問題は以下のタグ部分
<Directory "/path/to/auth/folder">
…
</Directory>
このディレクトリ指定に、tomcatのwebapps/tmt
と、www/html
で検証してみました。
が、駄目。
直ファイルではTomcatの方を優先してしまうらしく、イイ感じにauth対象を取ってくれませんでした。 そのため、httpd.confを以下のように変更。
<Location /> AuthType Digest AuthName "<Digest Auth Name>" AuthUserFile "/path/to/digest/config/file/<digest pass setting file name>" Require valid-user Satisfy Any Order deny,allow deny from all Allow from <Test Client Global IP> </Location>
Locationでルートフォルダ指定により、すべてのアクセスをdenyすることで対策を取りました。 Apacheそんなに詳しくないので、マサカリはあるだろうなーと思ったけどとりあえず良さそうな動きしてるしこのままで
参考資料
https://www.adminweb.jp/apache/allow/index8.html http://kakikukeko.sakura.ne.jp/blog/allow-ip-or-digest-authentication-on-apache/