Session 如何使用cookies正确启动会话,将其存储并使用机架会话在Sinatra应用程序中访问

Session 如何使用cookies正确启动会话,将其存储并使用机架会话在Sinatra应用程序中访问,session,cookies,login,sinatra,rack,Session,Cookies,Login,Sinatra,Rack,我有一个在Heroku上运行的Sinatra应用程序。我很难为我的用户正确设置cookies。我已经看了几天的例子和文档了,但似乎无法解决这个问题。我想让我的用户使用电子邮件和密码登录。如果登录成功,我想创建一个cookie,该cookie将在设定的时间后过期。如果用户关闭并重新打开浏览器,或者如果我将新代码推送到Heroku,我希望用户保持登录状态。我认为这只是饼干的正常使用,所以如果有人能帮我,我将非常感激 下面是我应该如何设置post'/login'路线 post '/login/?' d

我有一个在Heroku上运行的Sinatra应用程序。我很难为我的用户正确设置cookies。我已经看了几天的例子和文档了,但似乎无法解决这个问题。我想让我的用户使用电子邮件和密码登录。如果登录成功,我想创建一个cookie,该cookie将在设定的时间后过期。如果用户关闭并重新打开浏览器,或者如果我将新代码推送到Heroku,我希望用户保持登录状态。我认为这只是饼干的正常使用,所以如果有人能帮我,我将非常感激

下面是我应该如何设置post'/login'路线

post '/login/?' do

  #do_login is a helper method which checks if the user's credentials are correct

  if do_login
    use Rack::Session::Cookie, :key => 'rack.session',
                               :domain => 'www.Feistie.com',
                               :path => '/',
                               :expire_after => 2592000,
                               :secret => 'a_30_character_key',
                               :user_id => params[:user_id]
  end

end
即使这是正确的,我也不太明白。关键是什么?我假设:域名应该像我一样设置到我的网站上。那路径呢?为什么:路径设置为“/”?有没有一个地方我可以为我的Rack应用程序设置密钥?我不完全清楚cookie安全性是如何工作的。我也不确定是否可以像我那样将:user\u id添加到散列中

然后,下一部分是设置一个助手“logged_in?”以查看是否有人登录

def logged_in?
  !session.nil?
end
这可能是错误的,但我想我应该试试

我还需要能够检查当前用户实际上是谁。我以前是通过
会话[:user\u id]==@user.id
或类似的方式来实现的。我的主要问题是如何访问cookie中的:user_id值

最后是注销

post '/logout/?' do
  session.clear
end

如果你们能让我走上正轨,那就太棒了!提前感谢,如果您需要更多信息,我将很乐意提供。

您可以尝试使用
响应设置它。

response.set_cookie "user_id", {:value => params['user_id'], 
                                :expires => (Time.now + 52*7*24*60*60)}
您可以在其过期之前随时将其读回

request.cookies["user_id"]
删除cookie的步骤

response.delete_cookie "user_id"

您可以尝试使用
响应设置它

response.set_cookie "user_id", {:value => params['user_id'], 
                                :expires => (Time.now + 52*7*24*60*60)}
您可以在其过期之前随时将其读回

request.cookies["user_id"]
删除cookie的步骤

response.delete_cookie "user_id"

这比那简单得多。

我通常尝试将会话管理保持在
get
post
before
等块中的业务逻辑。您可以使用
before
过滤器“登录”当前会话的用户

before '*' do
  set :user_id, session[:user_id]
end
这是完全可选的,但您可以将任何cookie配置放在机架文件中:

use Rack::Session::Cookie, 
    :key => 'rack.session',
    :path => '/',
    :expire_after => 14400, # In seconds
    :secret => 'change_me'

比那简单多了。

我通常尝试将会话管理保持在
get
post
before
等块中的业务逻辑。您可以使用
before
过滤器“登录”当前会话的用户

before '*' do
  set :user_id, session[:user_id]
end
这是完全可选的,但您可以将任何cookie配置放在机架文件中:

use Rack::Session::Cookie, 
    :key => 'rack.session',
    :path => '/',
    :expire_after => 14400, # In seconds
    :secret => 'change_me'

只是一个想法。可能值得给每个用户一个随机令牌(
SecureRandom.hex
maybe),而不是他们的用户id。取得一些进展。谢谢首先,它应该是request.cookies。也许我可以编辑它,我看到一个编辑按钮。因此,键入以下内容:response.delete_cookie'user_id'response.set_cookie'user_id',{:value=>“some data”,:expires=>(Time.now+52*7*24*60*60)}放置请求。cookies['user_id']和响应只是“一些数据”。我似乎无法获得整个哈希作为响应。有什么想法吗?谢谢只是一个想法。可能值得给每个用户一个随机令牌(
SecureRandom.hex
maybe),而不是他们的用户id。取得一些进展。谢谢首先,它应该是request.cookies。也许我可以编辑它,我看到一个编辑按钮。因此,键入以下内容:response.delete_cookie'user_id'response.set_cookie'user_id',{:value=>“some data”,:expires=>(Time.now+52*7*24*60*60)}放置请求。cookies['user_id']和响应只是“一些数据”。我似乎无法获得整个哈希作为响应。有什么想法吗?谢谢