Расшифровка подписанного запроса 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, поскольку это не будет полное приложение (просто вкладка) и не требует дополнительных разрешений от пользователей. Также приветствуются любые рекомендации относительно моего метода обнаружения поклонников.

11
задан Anders H 14 February 2011 в 00:03
поделиться