#初めに
本番環境でBasic認証を導入したいと思いやってみました。
AWSはしたことはあるがHerokuでしたことがなかったので今回の行ったことを記したいと思います。
#Basic認証とは
Webサイトにアクセス制限するにあたり、簡易的に制限をかけることができる方法として挙げられるのはベーシック認証(Basic認証)。
ベーシック認証(Basic認証)はWebサーバーに付随している機能の1つでファイルに数行の記述をするだけで簡単にアクセス制限をかけることが可能です。
ベーシック認証(Basic認証)とはWebサイトの特定の領域、つまりページやファイルにアクセス制限をかけることができる認証方法の1つ。
ベーシック認証をかけると、認証をかけたWebサイトにアクセスしようとしたとき、上の画像のような認証ダイアログが立ち上がって、ユーザー名(ID)とパスワードの入力が求められる。
#Basic認証の特徴
##・メリット
###①ディレクトリ単位でのアクセス制限が可能
###②認証完了後はブラウザを閉じるまで有効
###③ブラウザがログイン情報を記憶
##・デメリット
###①セキュリティの脆弱性
- ※引用 -
ベーシック認証ではログイン情報を入力して送信する際に「Base64」という文字コードを用いて通信を行います。
「Base64」は簡易的な通信を行う際の文字コードで、アルファベット・数字・特定の記号のみの64種類の文字が利用可能です。
つまり、ベーシック認証で入力したログイン情報は、「Base64」の文字コードで表現できるアルファベット・数字・記号で通信されてしまいます。
もし、ベーシック認証をかけたWebページが「https」ではなく、SSL対応がされていない「http」通信である場合合、外部からログイン情報が盗聴されやすくなっているため注意が必要です。
###②クローラーもアクセスできない
###③サーバーをまたいだ設定ができない
###④スマートフォンではログイン情報を保存できない
#Basic設定方法(Heroku上にデプロイする。)
全てのコントローラでBasic認証を行うためにapplication_controller.rbにコードを追記。
RailsにはBasic認証をするための以下のメソッドが用意されている。
「authenticate_or_request_with_http_basic」
これがRailsで簡単にBasic認証を実装してくれるメソッド。
class ApplicationController < ActionController::Base
before_action :basic_auth, if: :production?
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
#環境変数にUSERとPAASSWORDを追記する。
% vim ~/.bash_profile
#「i」を押してインサートモードにいく
#自分で設定したUSERとPASSWORDを以下の様に追記する。
export BASIC_AUTH_USER='USER'
export BASIC_AUTH_PASSWORD='PASSWORD'
#escキーを押し、「:wq」を押して保存
% sudo vim /etc/environment
Password: #←手持ちPCのパスワード
#「i」を押してインサートモードにいく
#自分で設定したUSERとPASSWORDを以下の様に追記する。
BASIC_AUTH_USER='USER'
BASIC_AUTH_PASSWORD='PASSWORD'
#escキーを押し、「:wq」を押して保存
#heroku configにてHeroku上に反映されているか確認する。
% heroku config
=== アプリ名 Config Vars
BASIC_AUTH_USER: 'USER'
BASIC_AUTH_PASSWORD: 'PASSWORD'
username == ENV['BASIC_AUTH_USER'] && password == ENV['BASIC_AUTH_PASSWORD']は環境変数にする理由として、環境変数にせずGithubにコミットアップすると、パスワードが一目瞭然で分かるため。
#デプロイ動作確認
上記のやり方でBasic認証を設定できました。