【結論】
・Basic認証とは、ページへのアクセスを
ID/パスワードで制限する為の機能。
・手軽に実装できる反面、情報漏洩のリスクがある為、
セキュリティリスクの少ない物か、
一時凌ぎの対策として実装される。
【目次】
【本題】
チーム開発でBasic認証の実装を行った
今日でスクールのチーム開発が二日目ですが、
本日、アプリをインターネットに公開できる状態にするにあたり、
Basic認証の実装を行いました。
今回は、そのBasic認証についてまとめます。
Basic認証とは
HTTPで定義される認証方式の一つ。
少ない手間で実装できるメリットがある一方、
HTTP通信で定義されている仕様上、ユーザー名とパスワードが通信経路上に
そのまま送られるため、漏洩のリスクがある。
その為、漏洩してもセキュリティリスクが無い物や、
一時凌ぎの対策として実装されるのが一般的。
今回は、メルカリのクローンサイトを作成するという事もあり、
そのまま誰でも見れる状態で公開してしまうと、混乱を招く恐れがあるものの、
一般公開する事を想定していない為、Basic認証でアクセス制限を設けています。
Basic認証が設定されているページへアクセスすると、
下記の様なポップアップが表示されます。
そこに前もって設定してあったIDとパスワードを入力することで、
ログインすることができます。
実装方法
下記は、Basic認証の実装例です。
なお、いずれのページに繋がってもBasic認証が働く様に、
application_controller.rbに記述しています。
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
Ruby on RailsでBasic認証を実装するためには
「authenticate_or_request_with_http_basic」というメソッドを用います。
「authenticate_or_request_with_http_basic」は、
単体で認証の要求から入力されたユーザー名・パスワードの
判定まで行います。
ブロック変数( |username, password|)に入力した値が入り、
「username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]」で
あらかじめ設定したID・パスワードと比較を行い、双方とも等しければ、
「authenticate_or_request_with_http_basic」にtureを返して、アクセスを許可します。
なお、ENV["BASIC_AUTH_USER"] とENV["BASIC_AUTH_PASSWORD"]については、
環境変数と呼ばれるものです。
環境変数とは
OSの基本機能の一つで、
IDやパスワードなど、公開したく無い情報を、
外部に漏れない様に利用する機能です。
今回のBasic認証の場合、設定したいIDとパスワードを
コントローラー記述して、入力した値と比較を行います。
但し、IDやパスワードをコントローラーに直接記述してしまうと、
GitHubにコードを上げた際、ID・パスワードが丸分かりになってしまいます。
そこで、登場するのが環境変数です。
ID・パスワードをOSの環境変数に登録し、
それを参照する様に記述する事で、アプリの直接ID・パスワードを記述せずとも、
認証が可能となっています。
なお、環境変数は、開発環境ごとに設定する必要があるので、
本番環境とローカル環境の両方で実装したい場合は、両方を設定する必要があります。
総括
以上が、Basic認証に関する説明でした。
なお、今回メルカリクローンにBasic認証を実装するにあたり、
環境変数が読み込めないというエラーが発生しました。
問題:
本番環境にて、設定した通りのID/パスワードを入力しても、
Basic認証が通らない。
実施した事:
環境変数を利用せず、
アプリ側(コントローラー)に直接ID/パスワードを
記述すると、正常に認証可能。
→インスタンス内の環境変数が適用されない
「env | grep」で、
設定したID/パスワードは正常に表示される。
ローカル環境では、環境変数でログイン可能で、
そのID/パスワードをコピペしても改善なし。
EC2、nginx、MySQL Unicornの再起動は実施済み
リモートに.envファイルを作成して、
そちらを読み込む様に設定するも改善なし。
今回のBasic認証実装の位置づけは、誤ってアクセスしたユーザーが
本物のメルカリと勘違いしないようにするのが目的で、
コピーサイトであることを認識済みであるユーザーさんに
アクセスされる分には問題ないのと判断で、
環境変数を利用せず、直接アプリ側に記述する方法で実装しました。
この原因も、今後探って行ければと思います。
《今日の学習進捗》
チーム開発(メルカリのクローンサイト作成):二日目
自身の担当作業(完了分)
・自動デプロイの実装(S3とは未連携)
・product_controller の作成
・HTMLをHamlへ変換
・Basic認証(環境変数は未使用)
・device/RSpecの導入
・Font Awesomeの導入
・reset.scssの導入
Basic認証が上手く通らずに躓く。
但しデプロイが思いの外、スムーズにできる様になっていた。
以前、かなり躓いた事が、ここに来て活きていると感じる。
学習開始からの期間 :51日
今日までの合計時間:499h
今日までに到達すべき目標時間:466h
目標との解離:33h
「10,000時間」まで、
残り・・・「9501時間!」