デプロイ 〜ユーザー認証の導入〜

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/7d24b1ef-148a-c2b7-d855-4add30c79319.png)
1:ユーザー認証の導入
　デプロイしたアプリは、世界中の誰でもアクセスできる状態にあります。閲覧できるユーザーを制限するためにBasic認証を導入します。

①Basicベーシック認証
　Basic認証とは、HTTP通信の規格に備え付けられている、ユーザー認証の仕組みのことです。
　サーバーとの通信が可能なユーザーとパスワードをあらかじめ設定しておき、それに一致したユーザーのみが、Webアプリケーションを利用できるようにします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/6d0e2af3-1d88-02cf-018e-c88b37d730bf.png)

②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
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/d016dc1e-b205-e45a-8e86-577e8f09af68.png)

　Basic認証によるログインの要求は、すべてのコントローラーで行いたいです。そこで、Basic認証の処理をapplication_controller.rbのprivate以下にメソッドとして定義し、before_actionで呼び出します。

app/controllers/application_controller.rb
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/f99c5113-f2f1-a861-e486-2a2b01acc1ac.png)
これで、どのページにアクセスしても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ファイルに記述された内容を実行します。

３：開発環境で環境変数を設定（開発環境の環境変数に、ユーザー名とパスワードを設定）
　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アプリケーション側で読み込むように記述を変更します。

４： 環境変数をRailsアプリケーション側で読み込む設定
　app/controllers/application_controller.rb
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3457284/3aa451f5-7d98-b416-3f4f-bf1cb798f6d3.png)
→ username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]  # 環境変数を読み込む記述に変更

これで、環境変数を使って、Basic認証を行えるユーザー名とパスワードを定義できました。

５：環境変数が反映されているか確認
「　Basic認証が現れない場合」
　Basic認証が現れないという方は、シークレットウィンドウにて確認してみましょう。通常のウィンドウでは、一定期間「Basic認証を通過した」という情報が保持されるため、その期間はBasic認証が現れなくなります。

　一方で、シークレットウィンドウはそのような情報を保持しないため、Basic認証を確認することができます。下記のGIF参照。
https://i.gyazo.com/68393611c6cdb39df8fc60fae28b7802.mp4