アプリケーションにBasic承認を導入する時にハマったこと!!


Basic認証とは

Basic認証とは、HTTP通信の規格に備え付けられているユーザー認証の仕組み

解決したいこと
アプリケーションにBasic承認を導入する
正しいパスワードを設定し入力しているはずだが、ログインできない
(入力フォームが表示され入力もできる)
以下動作動画
https://gyazo.com/272b9a414067dc55c898907512c02b10
*ターミナル上では401のエラーが起きている

設定の流れ

ApplicationController.rb
class ApplicationController < ActionController::Base
  before_action :basic_auth

  private

  def basic_auth
    authenticate_or_request_with_http_basic do |username, password|
      username == 'sample' && password == '1234'
    end
  end
end

秘匿情報は公開できないので、環境変数を設定する!

username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
.bash_profile
#環境変数を設定

$ vim ~/.bash_profile
[I]
export BASIC_AUTH_USER='sample'
export BASIC_AUTH_PASSWORD='1234'
$ source ~/.bash_profile

正しいパスワードを設定し入力しているはずだが、ログインできない
(入力フォームが表示され入力もできる)
*401エラー

検証したこと
1.コントローラに直接ユーザー名とパスワードを入力すると正しくログインできる

2.Rails consoleで確認すると正しく値を取得できている?

[1] pry(main)> ENV["BASIC_AUTH_USER"]
=> ”sample”
[2] pry(main)> ENV['BASIC_AUTH_PASSWORD'] 
=> "1234"

3./etc/environment、vim ~/.bashrcに記載し直しても解決しなかった
 
4. binding.pryでは以下のように表示される


     6: def basic_auth
     7: 
     8:   authenticate_or_request_with_http_basic do |username, password|
 =>  9:     binding.pry
    10:     username == ENV["BASIC_AUTH_USER"] && password == ENV["BASIC_AUTH_PASSWORD"]
    11:     
    12:   end
    13: end
[1] pry(#<ItemsController>)> username 
=> "sample”
[2] pry(#<ItemsController>)> ENV["BASIC_AUTH_USER"]
=> nil

仮説

→環境変数を設定しているが、コントローラで正しい値を取得できていないかもしれない

解決の糸口

rails cでは値が取得できているが、rails sをbinding.pryで止めて値を確認すると『nil』
この二つの違いは何だろうか??

あっ、そういえばターミナルではそれぞれ別のタブを開いて作業している!
もしかすると、、、片方のタブで書き込んだ環境変数は、同時に立ち上げているもう一つのタブには反映されないのかもしれない!!

rails sしているタブで、$env を入力し中身を確認すると、、、、確かに別タブで設定したつもりのBASIC認証の環境変数がない!!!

⇨改めてrails sしていたタブで$source ~/.bash_profile すると、、、、
うまくいった!!!!!!!!!

学んだこと
basic承認に限らず、
ターミナルの環境変数はタブを立ち上げた瞬間に一度だけ読み込まれる。
もし、他のタブで環境変数などの設定をいじったら、関連するタブ全てに更新をかけること!!!以上