私の Sinatra アプリケーションには単純な認証システムがあります。ユーザーが正しいログインとパスワードを入力すると、基本的session[:user_id]
にユーザーのIDに設定されます。それだけです。今のところこれで十分です。別のソリューションは使用しません。
私がする必要があるのは、「私を覚えている」オプションを作ることです。では、単純なソリューションでこれを行うにはどうすればよいですか? 私はそれを理解することはできません。
私の Sinatra アプリケーションには単純な認証システムがあります。ユーザーが正しいログインとパスワードを入力すると、基本的session[:user_id]
にユーザーのIDに設定されます。それだけです。今のところこれで十分です。別のソリューションは使用しません。
私がする必要があるのは、「私を覚えている」オプションを作ることです。では、単純なソリューションでこれを行うにはどうすればよいですか? 私はそれを理解することはできません。
私が行った方法は次のとおりです (認証には OmniAuth を使用し、ユーザー ストレージには Mongoid を使用しています。ログイン フォームは AJAX を使用するため、応答は JSON です)。"Remember me" チェックボックスに対応する HTML フィールドは "remember" と呼ばれます:
post '/auth/identity/callback' do
u = User.find(env['omniauth.auth']['uid'])
session[:user] = u
session.options[:expire_after] = 2592000 unless params['remember'].nil? # 30 days
[200, {:msg => 'User logged in'}.to_json]
end
ここで重要なのはsessions.options[:expire_after]
ラインです。:expire_after を設定しない場合、ブラウザの終了時に Cookie は自動的に削除されます。設定すると、Cookie はブラウザーの再起動後も保持され、指定された秒数の間保持されます。
そのためにシナトラ Cookie を活用できます。おそらく「remember_me」パラメーターをチェックし、存在する場合はユーザー ID を Cookie に割り当てます。たとえば、これは Rails の例ですが、意図は同じです。
def login_user
begin
@user = User.authenticate(params)
if @user
if params[:remeberme]
cookies.permanent[:user_id] = @user.id.to_s
else
cookies[:user_id] = @user.id.to_s
end
end
rescue Exception => e
@errors = [e]
end
end