我在Heroku上创建了一个基于sinatra的脸书应用程序,通过Facebook提供的功能启动它(获取云应用程序或类似的东西)。一切都运行良好,但当我尝试使用Facebook的分数时,我意识到Heroku使用的Facebook API(即Mogli)不支持分数。 所以我尝试重写代码以使用fb_graph。但是因为那比我用空文件开始的所有东西都造成了更多的混乱。但我无法让它发挥作用。
所以基本上我想在heroku上使用fb_graph的基于Sinatra的应用程序的简单示例。样本应该只包含身份验证,因为其他一切看起来都非常简单并且有很多文档。只是初始身份验证不起作用。
我想在回调中使用默认的oauth2方法,因为它对我来说感觉更自然,但我对所有事情都开放。我知道有一个Rails示例,但我无法理解它,因为我的应用程序非常简单,Rails似乎有点过于强大。
如果有人能给我一些我想要做的必要的几行,那将是很棒的!
答案 0 :(得分: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
对于画布应用,我根据this gist
将以下代码添加到'rack-facebook-request.rb'到我的仓库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。
答案 1 :(得分:0)
看一下Koala宝石,我发现它很容易使用。