7

Usé ide y omniauth-facebook en mi aplicación Rails 3 para autenticación de Facebook, basada en este tutorial: Adding Facebook auth to Rails 3.1 app, ¡y está funcionando genial!token de acceso de la autenticación idee + omniauth-facebook para usar en fb-graph

Pero ahora quiero tener una integración total de Facebook en mi aplicación, con la que puedo acceder a las fotos del usuario, amigos, etc., y para eso estoy pensando en usar fb_graph. fb_graph requiere un token, y quería saber cómo editar mi modelo de usuario para guardar el token y usarlo en fb_graph. Cualquier ayuda con respecto a este asunto será muy apreciada.

Así es como mi modelo de usuario se parece en este 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

Let del [ver esto] (http://facebook-developer.net/2008/08/ 05/optimize-your-database-tables-for-facebook-connect /). Crea el modelo 'Facebook' y almacena en esa tabla, pero no estoy seguro de que sea la mejor manera. : P – Rafaiel

Respuesta

9

Usted puede hacer esto:

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

También tendrá que añadir: authentication_token o lo que llamaron a la attr_accessible

+0

¡Muchas gracias! Funcionó. Eres un salvavidas. – humairatasnim

+1

El único problema al que me enfrento ahora es que el token expira. Desautoricé la aplicación de mi Facebook con fines de prueba, y ahora, cuando intento volver a autorizarme, aparece este error: 'OAuthException :: Se debe usar un token de acceso activo para consultar información sobre el usuario actual' ¿Hay alguna manera de puede actualizar el token cada vez que un usuario inicia sesión en mi aplicación, para evitar que el token caduque? – humairatasnim

+0

Quizás haga un método en el modelo de usuario que llame a self.authentication_token = nil; self.save; durante la deauth No estoy seguro de cómo manejar esto todavía. En unos días probablemente lo haga. –

3

Estaba buscando lo mismo. Traté de implementar James Robey {s respuesta y sentido en el mismo error: OAuthException :: An active access token must be used to query information about the current user. Entonces me di cuenta de que authentication_token no se guardaba de esta manera. Después de mirar un rato, encontré en FbGraph + OmniAuth + Facebook Graph API on Rails application una forma de hacerlo con las variables de sesión, implementando el guardado del token durante la devolución de llamada de omniauth y luego usándolo al llamar a fb_graph. Por lo que podría ser algo como esto:

devolución de llamada OmniAuth (app/controllers/usuarios/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 

A continuación, cuando se llama a fb_graph

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

no sé si se trata de la mejor manera, pero funciona hasta ahora.

+0

gracias por su respuesta. Tengo una pregunta adicional: ¿cómo manejaría los tokens de actualización anteriores? – BKSpurgeon

1

enfermos que se refieren a https://github.com/nov/fb_graph/wiki/Page-Management

en noviembre Unidos: Es necesario token de acceso de la página para gestionar su página. Su token de acceso (de un usuario) no funciona aquí.

seguir su enlace al sitio de desarrolladores de Facebook para obtener más información

que necesita los usuarios señal_acceso y me hacen a través de OmniAuth-facbook https://github.com/mkdynamic/omniauth-facebook

la que se recupera el empleo mediante la introducción por primera vez este inicializador en su aplicación

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 

(nota puede cambiar los permisos en el ámbito que aquí comprobar los desarrolladores de Facebook login permisos para más

hay algunos mecanismos internos de OmniAuth y OmniAuth-facebook pero el jist es cuando recibe la llamada de retorno de facebook que tiene un bastidor OmniAuth hash a partir de la solicitud

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

de que ha se puede acceder al acceso de los usuarios símbolo como éste

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

a continuación, puede alimentar esa señal en tu página llamada fb_graph

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

entonces usted simplemente ser capaz de crear una nota llamando a su método deseado sin una referencia al token de acceso

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