2011-01-21 41 views
2

我想创建一个安全的cookie和我的Facebook应用程序的秘密,只有我知道,根据Facebook signed_request。我已经实施了Ruby method that decodes the signed_request sent by FacebookFacebook的Canvas身份验证与Sinatra:签名饼干(带机架)

这是行得通的,但现在,由于runwithfriends不会,我想向客户端发送一个使用相同签名过程的cookie。

我正在翻阅rack source code,它看起来像它提供了此功能。

但是,我想知道如何在Sinatra做到这一点。它看起来像set_cookie是围绕set_cookie_headers的包装,似乎不接受秘密。所以,我认为我必须用Rack做。我会尝试并报告。

与此同时,Sinatra Book表示它提供基于会话的cookie。

那么,有什么区别呢设定一个cookie之间:

set_cookie("u", 123) 

或设置会话变量:

session["u"] = 123 

我发现自己挖通过西纳特拉&机架源代码。我有个主意。我认为除了某些默认功能外,它们几乎是一样的。

回答

2

一个选项。

我会推荐使用服务器端“会话”解决方案为这样的Facebook应用程序。例如,https://github.com/jodosha/redis-store为您提供了一个可以存储序列化对象的Sinatra“缓存”对象。您可以为redis键设置过期时间,以避免内存过多。我建议使用facebook uid作为缓存的关键字,以便无论用户使用何种计算机/浏览器,她的会话都将始终如一。另外,这样您不必担心在iframe中设置cookie,这在Safari和Chrome中不起作用。

过滤器之前:@session = cache.fetch("session-#{@uid}") { {} }

过滤器后:cache.set("session-#{@uid}", @session)