根据 Facebook signed_request,我想创建一个安全 cookie 并使用只有我知道的 Facebook 应用程序的 secret 对其进行签名.
我已经实现了 Ruby method that decodes the signed_request sent by Facebook .
那行得通,但现在,作为 runwithfriends确实如此,我想向客户端发回一个使用相同签名程序的 cookie。
我正在浏览 rack source code ,看起来它提供了这个功能。
不过,我想知道如何在 Sinatra 中执行此操作。看起来 set_cookie
是 set_cookie_headers
的包装器,似乎不接受 secret 。所以,我想我必须用 Rack 来做。我会尝试并报告。
与此同时,Sinatra Book说它提供基于 session 的 cookie。
那么,设置 cookie 的区别是什么:
set_cookie("u", 123)
或设置 session 变量:
session["u"] = 123
我发现自己正在研究 Sinatra & Rack 源代码。我有个主意。我认为除了某些默认功能外它们几乎相同。
最佳答案
一个选项。
我建议为这样的 Facebook 应用程序使用服务器端“ session ”解决方案。 https://github.com/jodosha/redis-store例如,为您提供一个 Sinatra“缓存”对象,您可以在其中存储序列化对象。您可以为 Redis 键设置过期时间,这样内存就不会堆积太多。我建议使用 facebook uid 作为缓存的键,这样无论用户使用什么计算机/浏览器,她的 session 总是相同的。此外,这样您就不必担心在 iframe 中设置 cookie,这在 Safari 和 Chrome 中不起作用。
过滤器之前:@session = cache.fetch("session-#{@uid}") { {} }
过滤后:cache.set("session-#{@uid}", @session)
关于ruby - 使用 Sinatra : Signed Cookie (with Rack) 的 Facebook Canvas 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4754975/