Basic認証の導入(Rails)
※下記の内容に不備がありましたら、コメント頂けると幸いです。また、下記の内容をご使用頂く場合は自己責任でお願いします。
【目次】
メリット
①アプリを閲覧できるユーザーを制限することができる
②比較的簡単に実装することができる
背景
プログラミング学習のためにWebアプリを作成し、本番環境でも動作するか確認するためにデプロイを行った。
しかし、このWebアプリは一般公開する予定はないので、誤って他のユーザーがこのWebアプリにアクセスし誤解を生むことを防ぐため、認証機能を実装した。
内容
Basic認証とは?
HTTP通信の規格に備え付けられているユーザー認証の仕組み。
ユーザー名とパスワードを設定することで、その設定を知っているユーザーだけがWebアプリを利用できるようにすることができる。
Railsには、Basic認証を導入するためのメソッドが既に用意されている。
メソッド:authenticate_or_request_with_http_basic
これがBasic認証のメソッド
authenticate_or_request_with_http_basic do |username, password| username == 'username' && password == 'password' end
Basic認証の実装
◆app/controllers/application_controller.rbで、private以下に下記のメソッドを定義する
def basic_auth authenticate_or_request_with_http_basic do |username, password| username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] end end
さらに、before_actionでbasic_authメソッドを最初に呼び出すようにする
before_action :basic_auth
◆config/deploy/production.rbで、下記のコードを追記し、本番環境でのみBasic認証をするようにする
set :rails_env, "production" set :unicorn_rack_env, "production"
さらに、application_controller.rbの記述も変更する
before_action :basic_auth, if: :production?
---以下略---
private
def production?
Rails.env.production?
end
---以下略---
end
◆ターミナルでユーザー名とパスワードを環境変数に設定する
export BASIC_AUTH_USER='username'
export BASIC_AUTH_PASSWORD='password'
コマンド:source ~/.bash_profile
◆最後に、マージを行ったら、Capistranoを用いてデプロイを行う
※Basic認証の動作確認を初めて行う場合は、以下のようにデプロイとunicornの停止と起動をする
$ bundle exec cap production deploy unicorn:stop
(デプロイ完了まで待ち、完了後に以下を実行)
$ bundle exec cap production deploy unicorn:start
※うまく動かない場合は、EC2インスタンス、nginx、MySQL、Unicornを順番に再起動させてみる
今後に向けて
このBasic認証はHTTP通信で定義されていて、ログイン情報が通信経路上に送られるため、漏洩のリスクが非常に大きい。
また、複数のサーバーを跨いだ認証も難しいらしいので、実際の現場で使われる認証方式も調査したい。