7

Ho usato Devise e omniauth-facebook nella mia app Rails 3 per l'autenticazione di Facebook, basata su questo tutorial: Adding Facebook auth to Rails 3.1 app, e funziona benissimo!token di accesso da concepire + omniauth-facebook autenticazione per l'utilizzo in fb-graph

Ma ora voglio avere l'integrazione completa di Facebook nella mia app, con cui posso accedere alle foto, agli amici, ecc. Dell'utente, e per questo sto pensando di usare fb_graph. fb_graph richiede un token e volevo sapere come modificare il mio modello utente per salvare il token e usarlo in fb_graph. Qualsiasi aiuto in merito a questo argomento sarà molto apprezzato.

Ecco come il mio modello User assomiglia a questo momento:

class User < ActiveRecord::Base 

# Include default devise modules. Others available are: 
# :token_authenticatable, :encryptable, :confirmable, :lockable, :timeoutable and :omniauthable 
    devise :database_authenticatable, :registerable, 
    :recoverable, :rememberable, :trackable, :validatable, :omniauthable 

# Setup accessible (or protected) attributes for your model 
    attr_accessible :email, :password, :password_confirmation, :remember_me 

    has_many :photos 
    has_many :scrapbooks 

    def self.find_for_facebook_oauth(access_token, signed_in_resource=nil) 
    data = access_token.extra.raw_info 
    if user = User.where(:email => data.email).first 
     user 
    else # Create a user with a stub password. 
     User.create!(:email => data.email, :password => Devise.friendly_token[0,20]) 
    end 
    end 

    def self.new_with_session(params, session) 
    super.tap do |user| 
     if data = session["devise.facebook_data"] && session["devise.facebook_data"]["extra"]["raw_info"] 
     user.email = data["email"] 
     end 
    end 
    end 
end 
+0

Diamo [vedere questo] (http://facebook-developer.net/2008/08/ 05/ottimizzare-your-Database-tabelle-per-facebook-connect /). Creare il modello 'Facebook' e memorizzarlo in quella tabella ma non sono sicuro che sia il modo migliore. : P – Rafaiel

risposta

9

Si può fare questo:

User.create!(:email => data.email, :password => Devise.friendly_token[0,20], :authentication_token => access_token.credentials.token) 

Sarà inoltre necessario aggiungere: authentication_token o quello che chiamarono al attr_accessible

+0

Grazie mille! Ha funzionato. Sei un risparmiatore di vita. – humairatasnim

+1

L'unico problema che sto affrontando ora è che il token è scaduto. Ho annullato l'autorizzazione dell'app dal mio Facebook a scopo di test, e ora quando provo a riautorizzarmi, ottengo questo errore: 'OAuthException :: Un token di accesso attivo deve essere utilizzato per interrogare le informazioni sull'utente corrente' C'è un modo in cui io puoi aggiornare il token ogni volta che un utente accede alla mia app, per evitare che il token venga espirato? – humairatasnim

+0

Forse creare un metodo nel modello utente che chiama self.authentication_token = nil; self.save; durante la deauth. Non so come gestirlo ancora. Tra qualche giorno probabilmente lo farò. –

3

Stavo cercando la stessa cosa. Ho provato ad implementare la risposta di James Robey {s e mi sono sentito nello stesso errore: OAuthException :: An active access token must be used to query information about the current user. Poi ho capito che authentication_token non veniva salvato in questo modo. Dopo aver trovato un po 'di tempo ho trovato in FbGraph + OmniAuth + Facebook Graph API on Rails application un modo per farlo con le variabili di sessione, implementando il salvataggio dei token durante il callback omniauth e quindi utilizzandolo quando si chiama fb_graph. Quindi potrebbe essere qualcosa di simile:

callback omniauth (app/controllers/utenti/omniauth_callbacks_controller.rb)

class Users::OmniauthCallbacksController < Devise::OmniauthCallbacksController 
    def facebook 
    @user = User.find_for_facebook_oauth(request.env["omniauth.auth"], current_user) 

    if @user.persisted? 
     flash[:notice] = I18n.t "devise.omniauth_callbacks.success", :kind => "Facebook" 
# this part is where token is stored 
     auth = request.env['omniauth.auth'] 
     token = auth['credentials']['token'] 
     session[:fb_access_token] = token 
# 
     sign_in_and_redirect @user, :event => :authentication 
    else 
     session["devise.facebook_data"] = request.env["omniauth.auth"] 
     redirect_to new_user_registration_url 
    end 
    end 
end 

Poi quando si chiama fb_graph

@fb_user = FbGraph::User.new('me', access_token: session[:fb_access_token]).fetch 

non so se si tratta di il modo migliore, ma funziona così lontano.

+0

grazie per la risposta. Ho una domanda aggiuntiva: come gestiresti i token di aggiornamento come sopra? – BKSpurgeon

1

malato si fa riferimento a https://github.com/nov/fb_graph/wiki/Page-Management

dove Novembre Uniti: È necessario token di accesso della pagina per gestire la tua pagina. Il token di accesso (di un utente) non funziona qui.

seguire il suo collegamento al sito sviluppatori facebook per ulteriori informazioni

avrete bisogno gli utenti access_token e mi fanno attraverso omniauth-Facbook https://github.com/mkdynamic/omniauth-facebook

quale recuperare l'uso da prima inserendo questo initializer in la vostra applicazione

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :facebook, ENV['FACEBOOK_KEY'], ENV['FACEBOOK_SECRET'], 
      :scope => 'email,user_birthday,read_stream', :display => 'popup' 
end 

(notare che è possibile modificare le autorizzazioni sulla portata qui controllare gli sviluppatori di Facebook login autorizzazioni per ulteriori

ci sono alcuni meccanismi interni al omniauth e omniauth-facebook ma il jist è quando si ottiene la richiamata da Facebook si dispone di un rack omniauth hash dalla richiesta

omniauth = request.env["omniauth.auth"] 

da che si è è possibile accedere l'accesso degli utenti Token come questo

facebook_user_token = omniauth['credentials']['token'] 

si può quindi nutrire quella pedina nella tua pagina chiamata fb_graph

page = FbGraph::Page.new('FbGraph').fetch(
    :access_token => facebook_user_token, 
    :fields => :access_token 
) 

allora si sarà semplicemente essere in grado di creare una nota chiamando il metodo desiderato, senza un riferimento al token di accesso

note = page.note!(:subject => @title, :message => @message, :link => @url)