大田区から発信するゆるゆる日記

主にITエンジニアに関する備忘録日記。たまに趣味も。何か不備があればコメント頂けると幸いです。Twitterアカウント https://twitter.com/ryuzan03

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

  

◆ターミナルでユーザー名とパスワードを環境変数に設定する

コマンド:vim ~/.bash_profile

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、MySQLUnicornを順番に再起動させてみる

 

今後に向けて

このBasic認証はHTTP通信で定義されていて、ログイン情報が通信経路上に送られるため、漏洩のリスクが非常に大きい。

また、複数のサーバーを跨いだ認証も難しいらしいので、実際の現場で使われる認証方式も調査したい。