我在我的Sinatra应用程序中有一个简单的身份验证系统。当用户输入正确的登录名和密码时,它基本上将session[:user_id]
设置为用户的ID,就是这样。这是够了,现在,我不会用另一种解决方案。“记住我”选项 - 我该如何实现它?
我需要做的是做“记住我”选项。那么我怎么能为我的简单解决方案做到这一点?我无法弄清楚。
我在我的Sinatra应用程序中有一个简单的身份验证系统。当用户输入正确的登录名和密码时,它基本上将session[:user_id]
设置为用户的ID,就是这样。这是够了,现在,我不会用另一种解决方案。“记住我”选项 - 我该如何实现它?
我需要做的是做“记住我”选项。那么我怎么能为我的简单解决方案做到这一点?我无法弄清楚。
我已经做到了这是(我们使用OmniAuth的认证和Mongoid用户的方式存储 - 登录表单使用AJAX,因此回复为JSON)。对应于“记住我”复选框的HTML字段被称为“记忆”:
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就会在浏览器重新启动时变得持久,并保持指定的秒数。
您可以充分利用Sinatra Cookies。也许检查一个'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
对不起新手问题:cookie在客户端浏览器中是正确的?服务器端代码如何做到这一点? – texasbruce 2013-03-01 15:00:39
Cookie作为标题(Set-Cookies)的一部分与请求一起传输,然后在服务器端解析。这是sinatra如何做到的:https://github.com/sinatra/sinatra-contrib/blob/master/lib/sinatra/cookies.rb – fmendez 2013-03-01 15:08:14
将它保存在cookie中是非常不安全的。 – 2013-03-02 02:49:29