2012-02-08 4 views
2

Я пытаюсь выяснить, нравится ли пользователю страница нашего бренда. Исходя из этого, мы хотим показать любую кнопку или какой-то «спасибо».Захват Facebook signed_request с Sinatra

Я работаю с приложением sinatra, размещенным на геройку.

Я попробовал код из этой темы: Decoding Facebook's signed request in Ruby/Sinatra

Однако, это не похоже, чтобы захватить signed_request, и я не могу понять, почему.

У меня есть следующие методы:

get "/tab" do 
    @encoded_request = params[:signed_request] 
    @json_request = decode_data(@encoded_request) 
    @signed_request = Crack::JSON.parse(@json_request) 
    erb :index 
end 

# used by Canvas apps - redirect the POST to be a regular GET 
post "/tab" do 
    @encoded_request = params[:signed_request] 
    @json_request = decode_data(@encoded_request) 
    @signed_request = Crack::JSON.parse(@json_request) 
    redirect '/tab' 
end 

Я также вспомогательные сообщения из этой цепочки, так как они, кажется, имеет смысл для меня:

helpers do 
    def base64_url_decode(payload) 
    encoded_str = payload.gsub('-','+').gsub('_','/') 
    encoded_str += '=' while !(encoded_str.size % 4).zero? 
    Base64.decode64(encoded_str) 
    end 

    def decode_data(signed_request) 
    payload = signed_request.split('.') 
    data = base64_url_decode(payload) 
    end 
end 

Однако, когда я просто

@encoded_request = params[:signed_request] 

и читать это на мой взгляд с:

<%= @encoded_request %> 

Я ничего не получаю.

Не должно ли это вернуть хотя бы что-то? Мое приложение, похоже, рушится, потому что хорошо, что нечего декодировать.

Я не могу найти много информации об этом в Интернете, поэтому я был бы рад, если бы кто-нибудь мог мне помочь.

Есть ли лучшие способы узнать, нравится ли пользователю наша страница? Или, это путь, и я просто не замечаю ничего очевидного?

Спасибо!

ответ

2

Подсказка должна быть в вашем приложении, потому что нет ничего, что можно было бы расшифровать.

Я подозреваю, что параметры теряются при перенаправлении. Подумайте об этом на уровне HTTP:

  • Клиент отправляет сообщение /tab с подписанным_запросом в параметрах.
  • Приложение анализирует знак signed_request и сохраняет результат в переменных экземпляра.
  • Приложение перенаправляет на /tab, то есть отправляет ответ с кодом 302 (или аналогичным) и заголовком Location, указывающим на /tab. Это завершает цикл запроса/ответа, и переменные экземпляра отбрасываются.
  • Клиент делает новый запрос: GET до /tab. Из-за того, как работают перенаправления, у этого больше не будет параметров, которые были отправлены с исходным POST.
  • Приложение пытается проанализировать параметр signed_request, но сбой, поскольку такой параметр не был отправлен.

Простейшим решением было бы просто визуализировать шаблон в ответ на POST вместо перенаправления.

Если вам действительно нужно перенаправить, вам необходимо тщательно пройти вдоль параметров signed_request в качестве параметров запроса в пути перенаправления. По крайней мере, это решение, которое я использовал в прошлом. Там могут быть более простые способы решения этой проблемы или библиотеки, которые обрабатывают некоторые из них для вас.

+0

Спасибо. Эта разбивка на уровне HTTP была действительно полезна. Я сейчас создаю шаблон в POST, и он отлично работает; мне нужно ПОЛУЧИТЬ что-нибудь, если это просто на Facebook? Я могу оставить его, если люди посещают веб-сайт холста за пределами FB; но FB-мудрый, нам это нужно? Большое вам спасибо, это действительно повредило мне голову! – cabaret

+1

Рад, что я мог бы помочь! :) Исходя из того, что вы описываете, вам, вероятно, не понадобится обработчик GET. Если ваше приложение будет всего лишь одной страницей, все будет в порядке. – nfelger

Смежные вопросы