アプリの中でHTTPのBasic認証を行う仕様があり、その機能を実装しようと思ったときに、Basic認証のコードをテストできるテスト環境が欲しくなりました。
そこで、Dockerでコンテナ化しているWebサーバーでBasic認証で認証するページを作ろうと思いやり方を調べました。
Basic認証ができるまでに必要な手順は次の3つです。
- Webサーバーを用意する
- パスワードファイルを配置する
- Basic認証を行うURLを設定する
各手順は以下の通りです。
ステップ1 : Webサーバーを用意する
まずは、Webサーバーを用意します。WebサーバーはDockerでNginxをコンテナ化したものを使用します。
DockerでNginxを走らせる方法については、次の記事をご覧ください。
iOSアプリやAndroidアプリなどのネイティブアプリの開発で、HTTP/HTTPSでWebサーバーと通信する処理を実装するとき、固定のデータが戻ってきて欲しいということは多々あります。 UnitテストとかならHTTPの[…]
認証するURLは、http://localhost:8080/autharea
としたいので、content-home/autharea/index.html
ファイルも作成します。内容は接続できたことが確認できれば十分なので、次のような内容を書いておきます。
<html>
<head><title>Authorized Area</title></head>
<body><p>Here is an Authorized Area.</p></body>
</html>
ステップ2 : パスワードファイルを配置する
Basic認証では、認証するアカウント情報が入ったパスワードファイルが必要です。Dockerイメージをビルドするときに、パスワードファイルを生成するスクリプトをコンテナにコピーして実行するようにします。
パスワードファイルについて
パスワードファイルは、次のようなフォーマットで書かれたテキストファイルで、/etc/nginx/.htpasswd
に保存します。
ユーザー名:パスワード
1アカウント1行で書きます。また、パスワードは平文を書くのではなく、次のようにopenssl
で計算したハッシュ値を書きます。
openssl passwd -crypt Password
パスワードファイルを生成するスクリプト
パスワードファイルを生成するスクリプトを作ります。Dockerfile
と同じフォルダに、gen_htpasswd
ファイルを作成し、次の内容を入力します。
#!/bin/bash
USER_NAME=testuser
PASSWD=testpasss
CRYPTPASS=`openssl passwd -crypt ${PASSWD}`
echo "${USER_NAME}:${CRYPTPASS}" >> /etc/nginx/.htpasswd
このスクリプトは、ユーザー名がtestuser
、パスワードがtestpass
というアカウントを作成します。
パスワードファイル生成スクリプトを実行する
Dockerイメージをビルドするときに、スクリプトが実行されるようにします。ステップ1で作成したDockerfile
に次の内容を入力します。
FROM nginx:1.17
COPY nginx.conf /etc/nginx
COPY default.conf /etc/nginx/conf.d
COPY gen_htpasswd /etc/nginx
RUN apt-get update
RUN apt-get install -y openssl
RUN /etc/nginx/gen_htpasswd
ステップ1で作成したファイルに追記したのは、以下の部分です。
COPY gen_htpasswd /etc/nginx
RUN apt-get update
RUN apt-get install -y openssl
RUN /etc/nginx/gen_htpasswd
行っている処理は順に以下の通りです。
/etc/nginx
ディレクトリにgen_htpasswd
ファイルをコピーするapt-get
を使ってopenssl
をインストールする- コピーした
gen_htpasswd
を実行する
ステップ3 : Basic認証を行うURLを設定する
Basic認証を行うURLを設定します。ステップ1で作成したdefault.conf
ファイルのlocation /
の後にlocation /autharea
を追加します。
server {
# 省略
location / {
root /usr/share/nginx/html;
index index.html index.htm;
}
location /autharea {
root /usr/share/nginx/html;
index index.html index.htm;
auth_basic "Restricted";
auth_basic_user_file /etc/nginx/.htpasswd;
}
# 省略
}
/autharea
は認証するURLです。この場合は、以下のURLが認証対象になります。
http://localhost:8080/autharea
例えば、/autharea
を/member
とした場合は、次のURLが認証対象です。
http://localhost:8080/member
テスト
コンテナを実行して試して見ましょう。ステップ1で作成したコンテナは次のようにして、docker-compose経由でイメージをビルドします。
docker-compose build
イメージがビルドできたら、コンテナを実行します。
docker-compose up -d
Webブラウザでhttp://localhost:8080/autharea
に接続します。認証ダイアログが表示されるはずです。
作成したアカウント以外でログインしてみましょう。エラーとなり弾かれることを確認したら、作成したアカウントでログインしてみます。今度はログイン出来るはずです。