2011-01-21 2 views
2

Я хочу создать безопасный файл cookie и подписать его с помощью своего секретного приложения Facebook, которое я знаю только в соответствии с Facebook signed_request.Facebook Canvas Authentication with Sinatra: Signed Cookie (with Rack)

Я уже реализовал Ruby method that decodes the signed_request sent by Facebook.

Это работает, но теперь, как runwithfriends, я хочу отправить клиенту обратно файл cookie, который использует ту же процедуру подписания.

Я просматривал rack source code, и похоже, что он предоставляет эту функциональность.

Мне интересно, однако, как это сделать в Синатре. Похоже, set_cookie - обертка вокруг set_cookie_headers, которая, похоже, не принимает тайну. Поэтому, я думаю, мне нужно сделать это с помощью стойки. Я попробую это и отчитаю.

В то же время Sinatra Book говорит, что он предоставляет файлы cookie, основанные на сеансах.

Итак, в чем разница тогда между установкой печенье:

set_cookie("u", 123) 

или установка переменной сеанса:

session["u"] = 123 

я обнаружил, что копаться в исходном коде Rack Синатра &. У меня есть мысль. Я думаю, что они почти такие же, как некоторые функции по умолчанию.

ответ

2

Один вариант.

Я бы рекомендовал использовать «сеанс» на стороне сервера для приложения facebook, подобного этому. https://github.com/jodosha/redis-store, например, дает вам «кеш-файл» Sinatra, в котором вы можете хранить сериализованные объекты. И вы можете установить истечение для ключей redis, чтобы память не создавала слишком много. Я бы рекомендовал использовать facebook uid в качестве ключа для кеша, так что независимо от того, какой компьютер/браузер пользователь использует, ее сеанс всегда будет таким же. Кроме того, таким образом вам не нужно беспокоиться о настройке файлов cookie в iframe, что не работает в Safari и Chrome.

Перед фильтром: @session = cache.fetch("session-#{@uid}") { {} }

После фильтра: cache.set("session-#{@uid}", @session)