Docker+NginxでBasic認証を行うまでの3つの手順

アプリの中でHTTPのBasic認証を行う仕様があり、その機能を実装しようと思ったときに、Basic認証のコードをテストできるテスト環境が必要になりました。

そこで、Dockerでコンテナ化しているWebサーバーでBasic認証で認証するページを作りました。

Basic認証をできるようにするために必要な手順は次の3つです。

  1. Webサーバーを用意する。
  2. パスワードファイルを配置する。
  3. Basic認証を行うURLを設定する。
スポンサーリンク

ステップ1 Webサーバーを用意する

Webサーバーを用意します。WebサーバーはDockerでNginxをコンテナ化したものを使用します。DockerでNginxを走らせる方法については、次の記事をご覧ください。

関連記事

iOSアプリやAndroidアプリなどのネイティブアプリの開発で、HTTP/HTTPSでWebサーバーと通信する処理を実装するとき、固定のデータが戻ってきて欲しいということは多々あります。 例えば、XCTestで通信処理のユニット[…]

また、Nginxの設定ファイルを編集する必要があるので、次の記事を参考にDockerfileと同じフォルダに、nginx.confdefault.confをコンテナからコピーしてください。

関連記事

NginxにPOSTでアクセスすると、デフォルトの状態ではHTTP STATUS 405のエラーになってしまいます。Dockerでコンテナ化したNginxに開発中のアプリからアクセスしているときに、デバッグ用に固定のXMLを返すようにして[…]

認証するURLは、http://localhost:8080/authareaとしたいので、content-home/autharea/index.htmlファイルを作成します。内容は接続できたことが確認できれば十分なので、次のようにしました。

<!DOCTYPE html>
<html lang="ja">
<head>
	<meta charset="utf-8" />
	<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.23

COPY nginx.conf /etc/nginx
COPY default.conf /etc/nginx/conf.d
COPY gen_htpasswd /etc/nginx

RUN apt update
RUN apt install -y openssl

RUN /etc/nginx/gen_htpasswd

ステップ1で作成したファイルに追記したのは、以下の部分です。

COPY gen_htpasswd /etc/nginx

RUN apt update
RUN apt install -y openssl

RUN /etc/nginx/gen_htpasswd

以下の処理を行います。

  1. /etc/nginxディレクトリにgen_htpasswdファイルをコピーする。
  2. aptを使ってopensslをインストールする。
  3. コピーした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/に接続します。認証ダイアログが表示されるはずです。

SafariでBasic認証ダイアログを表示しているところ
SafariでBasic認証ダイアログを表示しているところ

作成したアカウント以外でログインしてみましょう。エラーとなり弾かれることを確認したら、作成したアカウントでログインしてみます。ログインできるはずです。

スポンサーリンク
最新情報をチェックしよう!