1:ユーザー認証の導入
デプロイしたアプリは、世界中の誰でもアクセスできる状態にあります。閲覧できるユーザーを制限するためにBasic認証を導入します。
①Basicベーシック認証
Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組みのことです。
サーバーとの通信が可能なユーザーとパスワードをあらかじめ設定しておき、それに一致したユーザーのみが、Webアプリケーションを利用できるようにします。
②Basic認証をRailsアプリケーションへ導入する。
authenticate_or_request_with_http_basicメソッドを利用して、開発中のRailsアプリケーションにBasic認証を導入します。
authenticate_or_request_with_http_basic
(オウセンティケイト オア リクエスト ウィズ エイチティティーピー ベーシックメソッド)
RailsアプリケーションでBasic認証を実装するために使用する、Railsのメソッドです。
ブロックを開き、ブロック内部でusernameとpasswordを設定することでBasic認証を利用できます。
【例】authenticate_or_request_with_http_basic
Basic認証によるログインの要求は、すべてのコントローラーで行いたいです。そこで、Basic認証の処理をapplication_controller.rbのprivate以下にメソッドとして定義し、before_actionで呼び出します。
app/controllers/application_controller.rb
これで、どのページにアクセスしてもBasic認証が要求されるようになりました。
③Basic認証の動作を確認します。
rails sをした上で、適当なページにアクセスすると、ユーザー名とパスワードの入力を求めるポップアップウィンドウが表示されます。
ターミナル(ローカル環境のアプリケーション)
% rails sを実行します。
間違ったユーザー名とパスワードではアクセスできないことを確かめるために、あえて適当な文字を入力してみます。以下のGIFでは、ユーザー名にhogehoge、パスワードに1111と入力しています。
https://i.gyazo.com/5150d82f814a09a1a0c2626c4bae1e08.mp4
2:Basic認証のコードを改良する。
ここまでの実装で、Basic認証をRailsアプリケーションに導入することができました。しかし、現状のコードには次の問題点があります。
◎ユーザー名とパスワードがコードに記述されている
Basic認証をするための、adminというユーザー名と、そのパスワード2222が、コードに記述されています。つまり、GitHub上の公開リポジトリでソースコードを管理している場合、コードを読める何者かに、不正にBasic認証を突破されてしまいます。
その対策として、コードに直接ユーザー名とパスワードを記述するのではなく、環境変数を利用する実装に切り替える方法があります。このとき、シェルと呼ばれるプログラムを用いて、環境変数を定義します。
シェルは、簡単に言うと「ターミナルとOSを繋ぐ窓口役」のような存在です。
ターミナルから入力されたコマンドを読み取って、OSに対して指示を渡し、結果をターミナルに返して表示や実行などの動作をさせます。
シェルを用いて、zshと呼ばれるファイルに環境変数を定義します。
zsh(ズィーシェル)
zshはログインシェルと呼ばれるもので、プログラムを実行する時に、ユーザーの要求に一番最初に対応する役割を担います。隠しファイルなので、特別な設定なしではFinderなどには表示されていません。
環境変数を記載する場所は、設定ファイルである「.zshrc」の中です。
設定ファイルは、vimというコマンドを用いて編集します。
vimヴィム
vimとは、サーバー上で使用できるテキストエディタです。vimコマンドを用いることで、指定したファイルの編集をターミナルから行うことが可能です。
以下が使用例になります。
【使用例】
ターミナル
% vim ~/.zshrc
vimには「通常モード」と「インサートモード」があります。
通常モードは、コマンドを打つことでファイルを保存したりvimを終了したりできます。
「通常モード」のコマンドには以下のようなものがあります。
①コマンド:w 説明:作成・編集したファイルを保存します。
②コマンド:q 説明:vimを終了します。
③コマンド:q! 説明:編集した内容を保存しないでvimを強制終了します。
④コマンド:wq 説明:編集した内容を保存してvimを強制終了します。
インサートモードは、ファイルに編集を加えることができます。この場合、「i」キーを押すことで「insert(インサート)モード」になり、文字の入力が可能です。
ファイル編集後は、Escキーを押すと「通常モード」に戻ります。
ファイル編集後は、sourceコマンドを実行する必要があります。
sourceソースコマンド
sourceコマンドとは、シェルに記述された内容を実行する役割を担います。今回は、zshファイルに記述された内容を実行します。
3:開発環境で環境変数を設定(開発環境の環境変数に、ユーザー名とパスワードを設定)
basic_authメソッド内で直接記述しているユーザー名とパスワードを、開発環境の環境変数に格納しましょう。
以下の手順に沿って実行します。
手順①
ターミナル(ローカル環境のアプリケーション)
% vim ~/.zshrc
手順②
「iキー」を押スト、インサートモードに移行します。
ターミナルの左下に「INSERT」と表示されたら成功です。
手順③
zshの内部に、以下の記述を追加します。
ターミナル
export BASIC_AUTH_USER='admin'
export BASIC_AUTH_PASSWORD='2222'
※既にzsh内に記述がある場合は、その記述の下に「追加」してましょう。既存の記述を削除してしまうと、パソコンが正常に動作しなくなる危険性があります。
手順④
記述を追加したら「escキー」を押して、 「:wq」と入力します。
入力後、「Enterキー」を押して終了します。
※ 「escキー」を押したタイミングで、ターミナル左下の「INSERT」が消えます。消えたことを確認したら、「:wq」と入力して、「Enterキー」を押します。
手順⑤
最後に、「sourceコマンド」を実行しましょう。
ターミナル(ローカル環境のアプリケーション)
% source ~/.zshrc
これでBASIC_AUTH_USERとBASIC_AUTH_PASSWORDという名前で、それぞれユーザー名とパスワードを定義できました。続いて、この環境変数をRailsアプリケーション側で読み込むように記述を変更します。
4: 環境変数をRailsアプリケーション側で読み込む設定
app/controllers/application_controller.rb
→ username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"] # 環境変数を読み込む記述に変更
これで、環境変数を使って、Basic認証を行えるユーザー名とパスワードを定義できました。
5:環境変数が反映されているか確認
「 Basic認証が現れない場合」
Basic認証が現れないという方は、シークレットウィンドウにて確認してみましょう。通常のウィンドウでは、一定期間「Basic認証を通過した」という情報が保持されるため、その期間はBasic認証が現れなくなります。
一方で、シークレットウィンドウはそのような情報を保持しないため、Basic認証を確認することができます。下記のGIF参照。
https://i.gyazo.com/68393611c6cdb39df8fc60fae28b7802.mp4