Как заставить приложение Sinatra на Heroku работать с fb_graph? - PullRequest
0 голосов
/ 25 января 2012

Я создал приложение Facebook на основе sinatra в Heroku, запустив его с помощью функции, предоставляемой Facebook (Get Cloud App или что-то в этом роде). Все работало нормально, но когда я попытался использовать Scores из Facebook, я понял, что API Facebook, используемый Heroku (то есть Mogli), не поддерживает Scores. Поэтому я попытался переписать код для использования fb_graph. Но так как это создавало больше путаницы, чем все, я начал с пустого файла. Но я просто не могу заставить это работать.

Так что, в общем, я хотел бы простой пример приложения на основе Sinatra на heroku, которое использует fb_graph. Образцы должны содержать только аутентификацию, поскольку все остальное кажется довольно простым и содержит много документации. Просто первоначальная аутентификация просто не работает.

Я бы хотел использовать подход oauth2 по умолчанию с обратным вызовом, поскольку он кажется мне более естественным, но я открыт для всего. Я знаю, что есть пример Rails, но я просто не могу разобраться с ним, и, поскольку мое приложение будет очень простым, Rails кажется немного подавленным.

Было бы здорово, если бы кто-нибудь дал мне всего несколько строк, необходимых для того, что я хотел бы сделать!

Ответы [ 2 ]

1 голос
/ 16 июня 2012

Я обнаружил, что это немного беспорядок.Старые учебники и код больше не имеют смысла.

Вы можете использовать пример Heroku + Facebook OmniAuth для создания внешнего веб-сайта (а не приложения для холста), который выполняет серверную Facebook(и многие другие) аутентификация.

Когда вы это сделаете, OmniAuth предоставит вам токен, который вам нужен для передачи в fb_graph.В приведенном примере вы можете добавить еще один URL:

get '/me' do
  me = FbGraph::User.me(session['fb_token']).fetch
  "Hello " + me.name
end

Для приложений холста я добавил следующий код в rack-facebook-request.rb в свой репозиторий на основе this gist

require 'base64'
require 'openssl'
require 'json'

# This is inspired by [rack-facebook-signed-request](https://github.com/gamesthatgive/rack-facebook-signed-request)
#
# Usage
#
#     use Rack::FBSignedRequest, :secret => 'SECRET'
#
class Rack::FBSignedRequest
  def initialize(app, options)
    @app = app
    @options = options
  end

  def call(env)
    @request = Rack::Request.new(env)
    if @request.POST['signed_request']
      if facebook_params = parse_signed_request(@request.params['signed_request'])
        @request.params['facebook_params'] = facebook_params
        env['rack.request.query_hash'] = @request.params
        env['REQUEST_METHOD'] = 'GET'
        puts 'Valid signed request. Changed REQUEST_METHOD to GET.'

        if facebook_params['user_id']
          env['fb_user_id'] = facebook_params['user_id']
          env['fb_access_token'] = facebook_params['oauth_token']
          puts 'Request has been authorized.'
        else
          puts 'Request is not authorized.'
        end

      else
        puts 'Not a valid signed request'
      end
    else
       puts 'Not a signed_request'
    end

    @app.call(env)
  end

  private

  # The following code from omniauth

  def parse_signed_request(value)
    signature, encoded_payload = value.split('.')

    decoded_hex_signature = base64_decode_url(signature)
    decoded_payload = JSON(base64_decode_url(encoded_payload))

    unless decoded_payload['algorithm'] == 'HMAC-SHA256'
      raise NotImplementedError, "unkown algorithm: #{decoded_payload['algorithm']}"
    end

    if valid_signature?(@options[:secret], decoded_hex_signature, encoded_payload)
      decoded_payload
    end
  end

  def valid_signature?(secret, signature, payload, algorithm = OpenSSL::Digest::SHA256.new)
    OpenSSL::HMAC.digest(algorithm, secret, payload) == signature
  end

  def base64_decode_url(value)
    value += '=' * (4 - value.size.modulo(4))
    Base64.decode64(value.tr('-_', '+/'))
  end
end

Это даст вам текущие fb_user_id и fb_access_token, если ваше приложение авторизовано.Помните, что вы должны использовать javascript или ссылку в iFrame для запроса авторизации приложения в этом случае.

0 голосов
/ 06 июня 2013

Посмотрите на камень Коала , я нашел его довольно простым в использовании.

...