2

根据Facebook signed_request,我想创建一个安全 cookie 并使用只有我知道的 Facebook 应用程序的秘密对其进行签名。

我已经实现了一个Ruby 方法来解码 Facebook 发送的 signed_request

那行得通,但是现在,就像runwithfriends一样,我想向客户端发送回一个使用相同签名过程的 cookie。

我正在查看机架源代码,看起来它提供了这个功能。

但是,我想知道如何在 Sinatra 中执行此操作。它看起来像是set_cookie一个包装器set_cookie_headers,它似乎不接受秘密。所以,我想我必须用 Rack 来做。我会尝试并报告。

同时,Sinatra Book说它提供基于会话的 cookie。

那么,设置cookie有什么区别:

set_cookie("u", 123)

或设置会话变量:

session["u"] = 123

我发现自己在挖掘 Sinatra & Rack 源代码。我有个主意。我认为除了某些默认功能外,它们几乎相同。

4

1 回答 1

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)

于 2011-01-21T03:35:12.440 回答