7

Ich habe Devise und omniauth-facebook in meiner Rails 3 App für Facebook-Authentifizierung, basierend auf diesem Tutorial: Adding Facebook auth to Rails 3.1 app, und es funktioniert super!Access Token von Devise + Omniauth-Facebook Authentifizierung für die Verwendung in fb-Grafik

Aber jetzt möchte ich eine vollständige Facebook-Integration in meiner App haben, mit der ich auf die Fotos, Freunde usw. des Benutzers zugreifen kann, und dafür denke ich an fb_graph. fb_graph benötigt ein Token, und ich wollte wissen, wie ich mein Benutzermodell bearbeiten kann, um das Token zu speichern und es in fb_graph zu verwenden. Jede Hilfe in dieser Angelegenheit wird sehr geschätzt. Diese

ist, wie mein User-Modell wie jetzt aussieht:

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

Lassen Sie uns rufen [siehe diese] (http://facebook-developer.net/2008/08/ 05/optimize-your-database-tables-für-facebook-connect /). Erstellen Sie "Facebook" -Modell und speichern Sie in dieser Tabelle, aber ich bin mir nicht sicher, ob das der beste Weg ist. : P – Rafaiel

Antwort

9

Sie dies tun können:

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

Sie müssen auch hinzufügen: authentication_token oder was auch immer Sie es an die attr_accessible benannt

+0

Vielen Dank! Es funktionierte. Du bist ein Lebensretter. – humairatasnim

+1

Das einzige Problem, mit dem ich jetzt konfrontiert bin, ist, dass der Token abgelaufen ist. Ich habe die App zu Testzwecken von meinem Facebook entfernt, und jetzt, wenn ich versuche, mich erneut zu autorisieren, bekomme ich diesen Fehler: "OAuthException :: Ein aktives Zugriffstoken muss verwendet werden, um Informationen über den aktuellen Benutzer abzufragen." Gibt es einen Weg, ich kann das Token jedes Mal aktualisieren, wenn sich ein Benutzer bei meiner App anmeldet, um zu verhindern, dass das Token abgelaufen wird? – humairatasnim

+0

Vielleicht machen Sie eine Methode im Benutzermodell, die self.authentication_token = nil aufruft; self.save; während der Deauth. Ich bin mir nicht sicher, wie ich damit umgehen soll. In ein paar Tagen werde ich wahrscheinlich. –

3

Ich war auf der Suche nach der gleichen Sache. Ich versuchte James Robey {s Antwort zu implementieren und fühlte mich in den gleichen Fehler: OAuthException :: An active access token must be used to query information about the current user. Dann erkannte ich, dass authentication_token nicht auf diese Weise gespeichert wurde. Nach einer Weile sah ich in FbGraph + OmniAuth + Facebook Graph API on Rails application einen Weg, um es mit Sitzungsvariablen zu tun, indem Sie die Token-Speicherung während omniauth Callback implementieren und dann beim Aufruf von fb_graph verwenden. So könnte es so etwas wie dieses:

omniauth Rückruf (app/controllers/users/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 

dann beim Aufruf fb_graph

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

Ich weiß nicht, ob es der beste Weg, aber funktioniert so weit.

+0

danke für deine antwort. Ich habe eine zusätzliche Frage - wie würde das oben genannte Update-Token behandeln? – BKSpurgeon

1

krank verweisen Sie auf https://github.com/nov/fb_graph/wiki/Page-Management

wo nov heißt es: Sie müssen das Zugriffstoken Seite um Ihre Seite zu verwalten. Ihr Zugriffstoken (eines Benutzers) funktioniert hier nicht.

folgen seinem Link zu der Website Facebook-Entwickler für weitere Informationen

Sie benötigen die Benutzer access_token und ich tun dies durch omniauth-facbook https://github.com/mkdynamic/omniauth-facebook

, die Ihnen die Verwendung abrufen, indem erste initializer in der Eingabe Ihre App

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 

(beachten Sie die Berechtigungen für den Umfang hier überprüfen Sie die Berechtigungen Facebook Entwickler

für mehr anmelden ändern

gibt es einige Innenleben omniauth und omniauth-facebook aber die jist ist wenn Sie den Rückruf von Facebook erhalten haben Sie ein Rack omniauth Hash aus der Anfrage

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

aus, dass hat können Sie den Benutzern den Zugriff zugreifen Token wie diese

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

können Sie dann das Token-Feed in Ihrem fb_graph Seite Aufruf

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

dann werden Sie einfach in der Lage sein, eine Notiz erstellen, indem Sie die gewünschte Methode ohne einen Verweis auf den Zugriffstoken

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