Railsでの認証の種類
Railsで開発をして行く上では、3種類の認証タイプがあります。
- Basic認証
- Digest認証
- Token認証
こちらの公式ページでも3種類のタイプが紹介されています。この三つを扱えればとりあえずいいのでは。
Basic認証
今回は最もシンプルな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="keita"とかコードに書いちゃうとGithubにミスってアップしちゃった時に確実に不正利用されます!気をつけて下さい!
ターミナルで 〜/.bash_profileに環境変数を書く
今回は本番環境のみでBasic認証が行われるようにします。
$ vim ~/.bash_profile
<!--「i」を押してインサートモードにいく-->
export BASIC_AUTH_USER='keita'
export BASIC_AUTH_PASSWORD='0322'
<!-- 書き終えたら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
もし「え、うまくいかないんだけど、、、、、、、」ってなった時に試すこと
-
AWSコンソールから EC2再起動
-
nginx手動で再起動
-
Mysql手動で再起動
-
Unicornをkill
してから もう一度自動デプロイコマンド実施
これで上手くいくはず。あとはコードを見直してみてください。
お疲れ様でした!
2026年3月 追記(最新情報)
この記事は2020年2月に投稿されました。
Basic認証自体の有効性
authenticate_or_request_with_http_basic はRails 8でも引き続き利用可能です。内部ツールやプロトタイプの簡易認証として有効です。
デプロイ環境の大幅変更
| 項目 | 2020年当時 | 2026年推奨 |
|---|---|---|
| デプロイツール | Capistrano | Kamal 2(Rails 8標準) |
| アプリサーバー | Unicorn | Puma(Rails 5+標準) |
| 環境変数管理 | ~/.bash_profile | rails credentials:edit |
| 開発時の環境変数 | 手動設定 | dotenv-rails gem |
環境変数の管理方法
~/.bash_profile への直接記述ではなく、Rails の暗号化credentials機能を推奨します:
# credentialsの編集
RAILS_MASTER_KEY=xxx rails credentials:edit
# コード内での参照
Rails.application.credentials.basic_auth_user
Rails 8 組み込み認証
より本格的な認証が必要な場合は、Rails 8の rails generate authentication で組み込み認証を生成できます。
