2012-01-25 3 views
0

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

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

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

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

ответ

1

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

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

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

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

Для брезентовых приложений, я добавил следующий код «стойку-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 or a link in the iFrame to request app authorisation.

0

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

 Смежные вопросы

  • Нет связанных вопросов^_^