Basic認証について

f:id:ryoutaku_jo:20190127203205p:plain

【結論】
Basic認証とは、ページへのアクセスを
 ID/パスワードで制限する為の機能。

・手軽に実装できる反面、情報漏洩のリスクがある為、
 セキュリティリスクの少ない物か、
 一時凌ぎの対策として実装される。


【目次】

【本題】

チーム開発でBasic認証の実装を行った

今日でスクールのチーム開発が二日目ですが、
本日、アプリをインターネットに公開できる状態にするにあたり、
Basic認証の実装を行いました。

今回は、そのBasic認証についてまとめます。

Basic認証とは

HTTPで定義される認証方式の一つ。

少ない手間で実装できるメリットがある一方、
HTTP通信で定義されている仕様上、ユーザー名とパスワードが通信経路上に
そのまま送られるため、漏洩のリスクがある。

その為、漏洩してもセキュリティリスクが無い物や、
一時凌ぎの対策として実装されるのが一般的。

今回は、メルカリのクローンサイトを作成するという事もあり、
そのまま誰でも見れる状態で公開してしまうと、混乱を招く恐れがあるものの、
一般公開する事を想定していない為、Basic認証でアクセス制限を設けています。

Basic認証が設定されているページへアクセスすると、
下記の様なポップアップが表示されます。

f:id:ryoutaku_jo:20190127203822p:plain

そこに前もって設定してあった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 RailsBasic認証を実装するためには
「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時間!」