@kyanny's blog

My thoughts, my life. Views/opinions are my own.

Heroku で WEBrick を起動して Basic 認証をかける場合は環境変数のセットを忘れずに

WEBrick で Basic 認証をかけるには、例えばこういうやり方ができるが、

d.hatena.ne.jp

require 'webrick'

include WEBrick

port = ENV['PORT']
user = ENV['USER']
pass = ENV['PASS']

server = HTTPServer.new(
  :Port => port,
  :DocumentRoot => './',
  :RequestCallback => lambda do |req, res|
    HTTPAuth.basic_auth(req, res, "my realm") do |username, password|
      username == user && password == pass
    end
  end
)

trap("INT"){ server.shutdown }
server.start

Heroku の場合ちょっとクセがあって、環境変数 USERPASS のいずれかが config:set されていないと、 Basic 認証がかからない。上記のコードだと、 Heroku にデプロイされている Ruby アプリケーションのルートディレクトリの dir index が丸見えになる。

localhost でこのプログラムを実行して WEBrick を起動すると、環境変数が未定義でも Basic 認証のダイアログが出る。 localhost で動作確認して heroku push した状態で環境変数をセットし忘れると、認証無しで Git リポジトリ内のデータを全て公開するハメになるので注意。

github.com

追記: これ、ローカルのシェルだと USER 環境変数が定義されてるからだった。 USER を unset したら Basic 認証かからなかった。