はじめに
個人でアプリケーション開発を行った時の必要最低限の認証機能を実装しました。
今回はその機能を簡単に実装できるように記載しました。
実行環境
pc: macOS Catalina
shell: zsh
rails: 6.0.0
ruby: 2.7.2
Basic認証とは?
Basic認証は、アプリケーションを使用できるユーザーを限定することです。
HTTP通信の規格に備え付けられているユーザー認証の仕組みのことをいいます。
サーバーとの通信が可能なユーザーとパスワードをあらかじめ設定し、それに一致したユーザーのみが、アプリケーションを利用できることです。
アプリケーションを本番環境を整えると、全世界誰でもアクセスができる状態になります。
その為ユーザーに制限をかけることで、ユーザー名・パスワードを知っている人のみ使用ができます。
導入方法
Basic認証はGemやAPIを使用しないで簡単に実装することが可能になります。
詳しくは以下になります。
1、app/controllers/application_controller.rbにauthenticate_or_request_with_http_basicメソッドを記述する。
2、開発環境に環境変数を設定する
以上
本番環境の場合は
3、本番環境の環境変数を設定する
Basic認証導入
まずは、Basic認証を使用できるように以下のコードを記述します。
class ApplicationController < ActionController::Base
before_action :basic_auth
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
環境変数の設定
次に、開発環境の環境変数を設定します。
ターミナルの以下の順番で処理を実行してください。
1: vim ~/.zshrc
2: インザートモードで以下を記述します。
export BASIC_AUTH_USER='ユーザー名'
export BASIC_AUTH_PASSWORD='パスワード'
3: escキー
4: :wq
5: Enterキー
6: source ~/.zshrc
これで環境変数の設定が完了しました。
本番環境で設定する場合(Heroku)
以下のコマンドをターミナルで実行してください。
# 以下で本番環境の環境変数設定ができます
heroku config:set BASIC_AUTH_USER="ユーザー名"
heroku config:set BASIC_AUTH_PASSWORD="パスワード"
# 正しく設定できているか確認できるコマンドは以下です
heroku config
解説
なぜ、application_controllerに実装するのか?
application_controllerはコントローラーの共通になるからです。
application_controllerに実装することで全てのコントローラーにBasic認証を要求することができます。
そして、before_actionを設定することでログイン前に実行できるようになります。
class ApplicationController < ActionController::Base
before_action :basic_auth
# before_actionを使用することで優先して処理をできるようにしています。
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
# ENV['BASIC_AUTH_USER'] && password == ENV['BASIC_AUTH_PASSWORD']は環境変数から設定した
# ユーザー名・パスワードを呼び出すためのコードになります。
end
まとめ
Basic認証は少ないコードで実装ができ便利ですが、安全性に関しては高い訳ではありません。
HTTP通信で定義されている為、ユーザー名・パスワードがそのまま漏洩するリスクもあります。
それに誰でも簡易に実装できるがために、オリジナルアプリに導入してもスコアがもらえることは無いでしょう。
ログアウト機能という概念が無いため、より性能を高めるためには複数のサーバーをまたいだ認証なため実装が困難になります。
そのため、画期的とは言えないでしょう。