Расшифровка подписанного запроса Facebook в Ruby / Sinatra - PullRequest
11 голосов
/ 14 февраля 2011

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

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

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

Ответы [ 3 ]

7 голосов
/ 14 февраля 2011

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

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

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

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

6 голосов
/ 17 февраля 2011

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

2 голосов
/ 21 июня 2011

Ответ от dorkitude был правильным.У меня просто была та же проблема, и заполнение ее с помощью "=" сработало.

Вы можете проверить это с помощью:

Base64.strict_decode64( invalid_payload )
=> ArgumentError: invalid base64
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...