Получение signed_request в приложении Facebook с помощью Ruby/Sinatra и драгоценного камня Rest-Graph

Я создал приложение для Facebook, используя Sinatra и гем Rest-Graph. Теперь я хочу встроить приложение в виде вкладки iframe на страницу Facebook.

Для этого мне нужно получить данные из signed_request, отправленного в мое приложение Facebook.

Gem Rest-Graph сообщает о следующей функции на своей странице Github:

Утилита для извлечения access_token и проверки входа в cookies/signed_request

Я не смог найти никакой документации о том, как использовать эту «утилиту». Можете ли вы указать мне какую-нибудь документацию или, что еще лучше, привести пример того, как это используется с Ruby/Sinatra?


person Javier    schedule 14.04.2011    source источник


Ответы (2)


Почти все доступные библиотеки Graph API работают с signed_request аналогичным образом. Rest-Graph имеет метод parse_signed_request (Rest -Graph/lib/core.rb), который вы можете вызвать в Sinatra.

Я использую Koala для этого с Sinatra, и он работает так, как рекламируется:

oauth = Koala::Facebook::OAuth.new(APP_ID, APP_CODE)
signed_request = oauth.parse_signed_request(params["signed_request"])

Вы возвращаете хэш объекта JSON, который публикует Facebook:

{
"algorithm"=>"HMAC-SHA256",
"issued_at"=>1303883452, 
"user"=> 
{
"country"=>"us",
"locale"=>"en_US"
},
"user_id"=>"100002364226618"
}

rest-graph также делает это довольно легко. Только что проверил это в приложении Sinatra. Отлично работает:

rg = RestGraph.new( :app_id => APP_ID, :secret => APP_SECRET)
parsed_request = rg.parse_signed_request!(params["signed_request"])

Дай мне знать, если это не сработает для тебя.

person cmptr    schedule 27.04.2011
comment
Только что увидел, что вы отредактировали свой код. Теперь это отражает решение, которое я получил сегодня от cardinalblue. В любом случае, поскольку вы были первым, кто ответил на мой вопрос, и я не могу забрать эту награду: она ваша. :) - person Javier; 03.05.2011

Я только что получил ответ на этот вопрос от "cardinalblue", разработчик драгоценного камня Rest-Graph. Этот небольшой пример был именно тем, что я искал:

require 'sinatra'
require 'rest-graph'

app_id = '123'
secret = 'abc'
config = {:app_id => app_id,
          :secret => secret}

post '/' do
  rg = RestGraph.new(config)
  rg.parse_signed_request!(params['signed_request'])
  "#{rg.get('me').inspect.gsub('<', '&lt;')}\n"
end

run Sinatra::Application

Примечание: если вы создаете что-то подобное, обратите внимание на post '/' do. Страницы Facebook извлекают вашу страницу используя запрос POST вместо GET.

person Javier    schedule 02.05.2011
comment
Да, я использую POST в своем приложении; думаю, я предполагал, что любой, кто хочет разобрать signed_request, будет делать то же самое. :) Ваше здоровье! - person cmptr; 03.05.2011
comment
Я полагаю, вы правы. Я просто добавил эту строку, потому что мне потребовалось некоторое время, чтобы получить это, так как мое приложение раньше не запускалось внутри FB canvas (вот почему я также искал эту вещь signed_request ;-)). - person Javier; 03.05.2011
comment
FWIW, Facebook также использует signed_request URL-адрес для деавторизации. Просто то, что вы, вероятно, захотите реализовать сейчас, когда вы успешно разбираете его. - person cmptr; 03.05.2011