Ruby 如何使Heroku上的Sinatra应用程序与fb_graph一起工作?

Ruby 如何使Heroku上的Sinatra应用程序与fb_graph一起工作?,ruby,heroku,sinatra,fbconnect,Ruby,Heroku,Sinatra,Fbconnect,我在Heroku上创建了一个基于sinatra的facebook应用,通过facebook提供的功能启动它(获取云应用或类似的东西)。一切都很顺利,但当我尝试使用Facebook的分数时,我意识到Heroku(即Mogli)使用的Facebook API不支持分数。 所以我试着重写代码来使用fb_图。但是,由于这造成了更多的混乱比一切,我开始与一个空文件。但我就是做不到 所以基本上我想要一个简单的例子,基于heroku的Sinatra应用程序,它使用fb_图。这些示例应该只包含身份验证,因为其他

我在Heroku上创建了一个基于sinatra的facebook应用,通过facebook提供的功能启动它(获取云应用或类似的东西)。一切都很顺利,但当我尝试使用Facebook的分数时,我意识到Heroku(即Mogli)使用的Facebook API不支持分数。 所以我试着重写代码来使用fb_图。但是,由于这造成了更多的混乱比一切,我开始与一个空文件。但我就是做不到

所以基本上我想要一个简单的例子,基于heroku的Sinatra应用程序,它使用fb_图。这些示例应该只包含身份验证,因为其他所有内容都非常简单,并且有大量文档。只是初始身份验证不起作用

我想在回调中使用默认的oauth2方法,因为我觉得它更自然,但我对一切都持开放态度。我知道有一个Rails的例子,但我就是想不通,因为我的应用程序非常简单,Rails似乎有点力不从心


如果有人能给我几行我想做的事,那就太好了

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

您可以使用进行服务器端Facebook(以及许多其他)身份验证的外部网站(而不是画布应用程序)

当您这样做时,OmniAuth将为您提供传递到fb_graph所需的令牌。在提供的示例中,您可以添加另一个url:

get '/me' do
  me = FbGraph::User.me(session['fb_token']).fetch
  "Hello " + me.name
end
对于canvas应用程序,我将以下代码添加到基于

如果您的应用获得授权,这将为您提供当前的fb_用户id和fb_访问令牌。记住,在这种情况下你必须使用它。

看看gem,我发现它很容易使用

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