Webサービスを作っていると、とりあえずbasic認証しとこうかな、なんて思うことがよくあります。

たとえば、機能はほぼできているんだけどまだ公開前だから軽く認証かけておいて関係者のみ見れるようにしたい、とか特典情報を載せたいけどそこまでシビアにガードしなくていいから軽く認証しておきたいとかのような場合です。

railsだと以下のように簡単にできちゃいます。

app/application_controller.rbに以下のようにメソッドを追加しましょう。

def authenticate_by_basic
  authenticate_or_request_with_http_basic do |username, password|
    username == ENV['BASIC_USERNAME'] && password == ENV['BASIC_PASSWORD']
  end
end

authenticate_or_request_with_http_basicメソッドはbasic認証で受け取ったユーザーネームとパスワードをブロックから受け取ることができます。

あとは、これをこちらが設定している認証情報を突き合わせをして、OKならtrueを返すようにします。

この例では環境変数に設定したENV['BASIC_USERNAME']ENV['BASIC_PASSWORD']との突き合わせをしています。

これは他にもconfig/credentialsとかその辺に入れたものでもいいですね。

ソースコードの中に書き込むのはbasic認証とはいえ、万が一ソースが流出した場合に備えてやめておいた方がいいでしょう。

あとはこのメソッドを利用するコントローラーでbefore_actionとか使って呼び出せばOKですね。

たとえば、app/sample_controller.rbに設定したい場合は以下のように書くことになるでしょう。

class SamplesController < ApplicationController 
  before_action :authenticate_by_basic

  # 以下略
end

もし、アプリケーション全体にbasic認証を仕掛けたい場合はApplicationControllerでbefore_actionするとよいと思います。

ローカルの開発環境でdotenv-railsのGemを使っているなら、.envに以下のように認証情報を書く感じ。

さすがに、この認証情報だとゆるすぎるので、もっと複雑にしとくといいとです。

BASIC_USERNAME=user
BASIC_PASSWORD=1234

または、ローカルではbasic認証をスキップしたい、なんてときは先ほどの認証用メソッドに以下のように追加する、というのもよくやりますね。

def authenticate_by_basic
  return if Rails.env.development? # 追加

  authenticate_or_request_with_http_basic do |username, password|
    username == ENV['BASIC_USERNAME'] && password == ENV['BASIC_PASSWORD']
  end
end

自分はページに認証をかけるときは万が一に備えてnoindex nofollowを設定しておくことが多いです。

この記事の環境情報

  • rails 7.0.4
  • HTMLメールを書いた次の日の朝