2012-01-25 55 views
0

我在Heroku上创建了一个基于sinatra的facebook应用程序,并通过Facebook提供的功能(获取云应用程序或类似功能)启动它。一切正常,但是当我尝试使用Facebook上的分数时,我意识到Heroku使用的Facebook API(它是Mogli)不支持分数。 所以我试图重写代码来使用fb_graph。但是由于这造成了比我用空文件开始的所有事情更多的困惑。但我不能使它工作。如何在Heroku上使用fb_graph制作Sinatra应用程序?

所以基本上我想为一个基于Sinatra的应用程序在heroku上使用fb_graph的简单示例。样本应该只包含认证,因为其他一切看起来很简单,并且有很多文档。只是初始身份验证不起作用。

我想在回调中使用默认的oauth2方法,因为它对我来说只是感觉更自然,但我对任何事情都是开放的。我知道有一个Rails的例子,但我无法理解它,因为我的应用程序将非常简单Rails似乎有点过分强大。

如果有人能为我想做的事提供我所需的几条线,那将是非常棒的!

回答

1

我发现这有点混乱。旧的教程和代码已经没有意义了。

您可以使用Heroku + Facebook OmniAuth example来执行服务器端Facebook(以及其他许多)身份验证的外部网站(而不是画布应用)。

当你这样做时,OmniAuth会为你提供你需要传递给fb_graph的令牌。在提供的例子中,你可以添加另一个网址:

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宝石,我发现它很容易使用。

相关问题