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を走らせる方法については、次の記事をご覧ください。

認証する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

行っている処理は順に以下の通りです。

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

 

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

投稿者プロフィール

林 晃
林 晃macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者
アールケー開発代表。macOS/iOSアプリ/SDK/ミドルウェア開発が専門の開発者。ObjC/Swift/C++使い。豊富な開発実務経験を基に、教育コンテンツ開発、技術書執筆、技術指導、技術セミナー講師、企業内研修講師、行政・自治体職員研修講師も行います。

基礎から学ぶMetal


「基礎から学ぶMetal」を執筆しました。本書はMetalを使ってGPUプログラミングを行うための最初のステップを解説するMetalの解説書です。

私が初めてGPUプログラミングを行ったとき、どこから手をつけて、学んでいけば良いのか分からず呆然としました。もし、あのとき、これを教えてくれればという部分を解説しました。本書で解説している部分はMetalの基礎となる部分で、Metalを使うときに必ず触れることになる部分です。

詳細

基礎から学ぶSwiftUI


「基礎から学ぶ SwiftUI」というタイトルの本を執筆しました。

SwiftUIの入門書です。

SwiftUIのコンセプトは「ユーザーインターフェイスを作るための最短パスを提供する」「一度学べば(Appleのプラットフォームの)どこにでも適用できる」です。

SwiftUIの概要から始まって、一つ一つのテクノロジートピックに注目しながらSwiftUIとは何か?どんなことができるのか?どのようなコードを書けば良いのかなどを丸々一冊使って解説しています。

詳細

関連記事

  1. NginxのPOSTの設定

  2. HomebrewをWindows上で使えるようにする

  3. Nginxで帯域制限を行う方法

  4. 【2021/6/23更新】 Xcodeの動作環境

  5. Windows Server 2016 への Hyper-V のインス…

  6. Parallels Desktopで古いmacOSゲストをセットアップ…

最近の著書

  1. 基礎から学ぶ SwiftUI

最近の記事