🕌

Sinatraでログイン機能を実装する

2023/06/10に公開

簡易的なログイン機能を実装する

本来であれば、認証周りの実装を行う際はパスワードをハッシュに変換して受け渡したり、ログイン保持のためにクッキー機能を使ったりとかなり複雑な技術を使用するのですが、比較的簡単に使えそうなsession機能のみを使用してユーザー情報を保持するログイン機能を作ってみました。

  • session(ブラウザに状態を保持しておくための機能)を使えるように設定します
  • sinatraにはdefaultでは実装されていないためenableに設定しましょう
app.rb
enable :sessions  
  • usersテーブルにはあらかじめ、name、passwordという2つのカラムを用意しておきます
  • UserクラスをActiveRecord::Baseクラスを継承させます








  • サインアップのルーティングを作成します
get '/signup' do
   erb :signup
end

post '/signup' do
   @user = User.new(name: params[:name], password: params[:password])
   if @user.save
     session[:user_id] = @user.id
     redirect "/user/#{@user.id}" 
   else
     erb :signup
   end
end

ユーザーがデータベースに登録されたときは、そのユーザーのidを、:user_idとしてsessionに格納しています

if @user.save
    session[:user_id] = @user.id
end
  • サインアップのerbテンプレートを作成します
signup.erb
<p>サインアップ</p>
<form action="/signup" method="post">
  <label for="name">名前: </label>
  <input id="name" type="text" name="name">
  <label for="password">パスワード:</label>
  <input id="password" type="password" name="password">
  <input type="submit" value="送信">
</form>
  • ログインのルーティングを作成します
get '/login' do
  erb :login
end

post '/login' do
   @user = User.find_by(name: params[:name], password: params[:password])
   if @user.nil?
     redirect "/login"
   end
   session[:user_id] = @user.id
   redirect "/user/#{@user.id}"

sessionに格納された:user_idと、ログインしようとしているユーザーのidを比較して、同一である時のみ詳細ページにリダイレクトされます

  • ログインのerbテンプレートを作成します
login.erb
<p>ログイン</p>
<form action="/login" method="post">
  <label for="password">名前:</label>
  <input id="name" type= "text" name="name">
  <label for="password">パスワード:</label>
  <input id="password" type= "password" name="password">
  <input type= "submit" value="ログイン">
</form>
  • ログアウトのルーティングを作成します
post '/logout' do
  session.clear
  redirect '/'
end
  • ログインのフォームを作成します
<form method="post" action="/logout">
    <button>logout</button>
</form>

これでひととおり、サインアップ、ログイン、ログアウトの機能を実装できました🎵
ただし、sessionの生存期間は短いのと、今回のログイン方法ではセキュリティー上の問題などもあるため、あれば正しい認証機能の実装方法も勉強します!!!

参照:
[sinatraでログイン機能]https://qiita.com/ibarakishiminn/items/96c5b13a687ee8ca98f2
Railsで挫折した人のためのSinatra -5-

Discussion