Расшифровка подписки на 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