最近、Railsで作っていたアプリにBasic認証を導入したのでその時のメモです。
そもそもBasic認証って何?
Basic認証とは、サーバーと通信する時にユーザー名とパスワードを知っている人じゃないと、そのサイトにアクセス出来ないようにするための機能です。
画像だとこんな感じですね。見たことある方いらっしゃると思います。では、実装していきます。
前提
- アプリケーションサーバーはUnicornを使っているとする
- WebサーバーはNginxを使っているとする
- クラウドはAWSを使っているとする
- Capistranoを用いて自動デプロイをしているとする
application_controllerにメソッドを書く
Basic認証は全てのコントローラで行いたいので、application_controller.rbにコードを書いていきます!
RailsにはBasic認証をするためのメソッドが用意されてるます。
それがauthenticate_or_request_with_http_basic
です!
class ApplicationController < ActionController::Base
before_action :basic_auth
protect_from_forgery with: :exception
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
end
authenticate_or_request_with_http_basicはRailsで簡単にBasic認証を実装してくれるメソッドです!
username == ENV["BASIC_AUTH_USER"]
&&
password == ENV["BASIC_AUTH_PASSWORD"]
のところは環境変数にしてます。直接、username="kenji"とかコードに書いちゃうとGithubにミスってアップしちゃった時に確実に不正利用されます!気をつけて下さい!
ターミナルで、.bash_profileに環境変数を書く
今回は本番環境でやると仮定してます!
ssh接続してサーバーにアクセスして下さいね!
$ vim ~/.bash_profile
###「i」を押してインサートモードにいく
export BASIC_AUTH_USER='kenji'
export BASIC_AUTH_PASSWORD='1234'
###書き終えたらescキーを押して、「:wq」を押して保存して終了
$ source ~/.bash_profile
###最後に.bash_profileを読み込んで環境変数を反映させる
本番環境でのみBasic認証をするようにする
config/deployのproduction.rbに追記していきます。
# server "db.example.com", user: "deploy", roles: %w{db}
server "(御自身のEC2のIPアドレス)", user: "ec2-user", roles: %w{app db web}
set :rails_env, "production"
set :unicorn_rack_env, "production"
# role-based syntax
# ==================
これでunicornが現在の環境を本番環境として認識するようになります。
さらにapplication_controllerの記述を変更する
class ApplicationController < ActionController::Base
before_action :basic_auth, if: :production?
protect_from_forgery with: :exception
private
def production?
Rails.env.production?
end
def basic_auth
authenticate_or_request_with_http_basic do |username, password|
username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
end
end
end
追加したのは
before_action :basic_auth, if: :production?
def production?
Rails.env.production?
end
の二つだけです。
production?メソッドでRails.env.production?を定義しているので本番環境なのかローカルなのか分かるようになっています。
#最後にデプロイして動作確認
$ bundle exec cap production deploy unicorn:stop
$ bundle exec cap production deploy unicorn:start
もし「え、うまくいかないんだけど、、、、、、、」ってなった場合は、一度AWSのコンソールからEC2を再起動して下さい!その後、nginx、MySQL、Unicornを手動で順番に再起動してください。それでうまくいくはずです。
お疲れ様でした!
しっかりBasic認証できてるはずです!