2012-01-25 6 views
0

페이스 북에서 제공하는 기능으로 시작하여 Heroku에서 sinatra 기반의 Facebook 앱을 만들었습니다 (클라우드 앱 또는 그와 비슷한 제품 얻기). 모든 것이 잘 작동했지만 Facebook의 점수를 사용하려고 시도했을 때 Heroku (Mogli)가 사용하는 Facebook API가 점수를 지원하지 않는다는 것을 깨달았습니다. 그래서 fb_graph를 사용하도록 코드를 다시 작성하려고했습니다. 하지만 빈 파일로 시작한 모든 것보다 더 많은 혼란이 생겼습니다. 그러나 나는 그것을 작동하게 만들 수 없다.fb_graph를 사용하여 Heroku에서 Sinatra 앱을 만드는 방법은 무엇입니까?

기본적으로 나는 fb_graph를 사용하는 heroku의 Sinatra 기반 앱에 대한 간단한 예제를 원합니다. 샘플에는 인증 만 포함되어야합니다. 다른 모든 것들은 꽤 솔직하게 보이고 많은 문서가 있기 때문입니다. 그냥 초기 인증 그냥 작동하지 않습니다.

나는 콜백에 기본 oauth2 접근법을 사용하고 싶다. 왜냐하면 그것은 나에게 자연스러운 느낌을주기 때문이다. 그러나 나는 모든 것을 위해 열려있다. 나는 레일즈 예제가 있다는 것을 알고 있지만, 그저 내 주변에 머리를 들이지는 못한다. 그리고 내 애플 리케이션이 매우 간단 할 것이기 때문에 레일스는 약간 압도적 인 것처럼 보인다.

누구나 내가하고 싶은 것을 몇 줄 줄 수 있다면 좋을 것입니다!

답변

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

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 

이에 따라 내 REPO에 '랙 페이스 북-request.rb'에 다음 코드를 추가 앱이 승인되면 현재 fb_user_id 및 fb_access_token을 제공합니다. 이 경우 javascript or a link in the iFrame to request app authorisation을 사용해야한다는 것을 기억하십시오.

0

Koala 보석을 살펴보면 매우 사용하기 쉽다는 것을 알았습니다.

관련 문제