Захватите Facebook подписанный запрос с Синатрой - PullRequest
2 голосов
/ 09 февраля 2012

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

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

Я попробовал код изэта тема: Расшифровка подписанного запроса Facebook в Ruby / Sinatra

Однако, кажется, что он не захватывает подписанный запрос, и я не могу понять, почему.

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

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 %>

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

Не должно ли это вернуться вхоть что то?Кажется, мое приложение зависает, потому что ничего не нужно декодировать.

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

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

Спасибо!

1 Ответ

2 голосов
/ 09 февраля 2012

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...