Расшифровка подписки на Facebook в Ruby/Sinatra

Из-за того, что Facebook не одобряет новый FBML, я ищу новый способ создания вкладки "раскрыть" (вкладка страницы, в которой одна версия для фанатов, а другая - для не-фанатов). Facebook добавил данные в signed_request:

Когда пользователь выбирает ваше приложение в левое меню, приложение получит параметр signed_request с одним дополнительный параметр, страница, JSON массив, который содержит "идентификатор Страница Facebook, на которой размещена ваша вкладка внутри, логическое (" понравилось "), указывающее нравится или нет пользователю Страница и логическое ('admin) указывает, является ли пользователь" Администратор страницы" вместе с информационный массив пользователя.

Я могу прочитать файл signed_request, но потом мне нужно обработать его с расширением base64url, чтобы получить правильный JSON. Кроме того, в моих исследованиях я обнаружил, что JSON неправильно отформатирован для Ruby, поэтому его необходимо изменить до его декодирования. Здесь текущий код (я просто печатаю подписанный запрос в index.erb):

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

  def decode_data str
    encoded_sig, payload = str.split('.')
    data = ActiveSupport::JSON.decode base64_url_decode(payload)
  end
end

get '/' do
  signed_request = params[:signed_request]
  @signed_request = decode_data(signed_request)
  erb :index
end

Я стараюсь, чтобы приложение было как можно более легким, и не используйте полную библиотеку Facebook, так как это не будет полным приложением (только вкладкой) и не потребует никаких дополнительных разрешений от пользователей. Любые рекомендации относительно моего метода обнаружения болельщиков также приветствуются.

Ответ 1

Я столкнулся с этим раньше. Вам просто нужно заполнить конец строки полезной нагрузки метками =, пока ее длина не будет делиться на 4.

Это будет работать:

payload += '=' * (4 - payload.length.modulo(4))

(Я не уверен, где/если это задокументировано Facebook, но кто-то из IRC рассказал мне об этом в начале 2011 года, и, конечно же, с тех пор я нашел такое дополнение в исходном коде различных клиентских библиотек Facebook )

Ответ 2

Я использую библиотеку fbgraph, которая работает parse_signed_request.

Ответ 3

Ответ от правды был верным. У меня была одна и та же проблема, и она заполняла ее "=".

Вы можете проверить это, используя:

Base64.strict_decode64( invalid_payload )
=> ArgumentError: invalid base64