Heroku上のPHPアプリケーションにBASIC認証を導入する

Heroku上でnginxをWEBサーバとしたPHPアプリケーションに対してBASIC認証をかける

流れ

  • BASIC認証の設定はnginxの設定ファイルに記述
  • IDやパスワードは環境変数に登録
  • htpasswdファイルはデプロイ時に生成

前提

ディレクトリの初期構成は以下の通り。

public/
    index.php
vendor/
composer.json
Procfile

composer.jsonは

{
    "require-dev": {
        "heroku/heroku-buildpack-php": "*"
    }
}

として、composer install or updateをして、vendor/binディレクトリにvendor/bin/heroku-php-nginxがインストールされている。

Procfileは

web: bin/heroku-php-nginx public

として、ドキュメントルートをpublicフォルダとしてデプロイしている。

手順

  1. 環境変数にBASIC認証アカウントを登録
    $ heroku config:set BASIC_AUTH_USERNAME="basic_auth_user"
    $ heroku config:set BASIC_AUTH_PASSWORD="basic_auth_pass"
    

    またはWEBコンソール (https://dashboard.heroku.com/apps/APPNAME/settings) で追加する

  2. nginxにBASIC認証の設定を加えるため、設定の追加をする

    1. 設定用のフォルダを作成する
      $ mkdir heroku
      $ cd heroku
      
    2. nginx_app.confというファイルを作成する。すでにある場合は、auth_basic,auth_basic_user_fileの部分を追記する
      location / {
          auth_basic            "Restricted";
          auth_basic_user_file  $document_root/../.htpasswd;
      }
      

      このサンプルではルート下すべてをBASIC認証の領域とする。

    3. Procfileを編集して、デプロイ時にnginx_app.confを読み込むませる

      web: bin/heroku-php-nginx -C heroku/nginx_app.conf public
      
  3. Herokuの.profile.dの仕組みを使って、htpasswdファイルを生成するbashスクリプトを追加する
    $ mkdir .profile.d
    $ cd .profile.d
    $ vi gen-htpasswd.sh
    

    gen-htpasswd.shは

    #!/usr/bin/env bash
    set -ex
    
    echo -e "${BASIC_AUTH_USERNAME}:$(perl -le 'print crypt($ENV{"BASIC_AUTH_PASSWORD"}, rand(0xffffffff));')" > /app/.htpasswd
    
  4. Herokuにデプロイする

参考

広告