facebook-graph-api - the - facebook oauth response example
El token de acceso de la autenticación idee+omniauth-facebook para usar en fb-graph (3)
Utilicé ide y omniauth-facebook en mi aplicación Rails 3 para la autenticación de Facebook, basada en este tutorial: Agregar la autenticación de Facebook a la aplicación Rails 3.1 , ¡y funciona muy bien!
Pero ahora quiero tener una integración completa de Facebook en mi aplicación, con la que puedo acceder a las fotos, amigos, etc. del usuario, 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 se ve mi modelo de usuario 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
Estaba buscando lo mismo. Traté de implementar la respuesta de James Robey y sentí 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 la aplicación FbGraph + OmniAuth + Facebook Graph API on Rails una forma de hacerlo con las variables de la sesión, implementando el guardado del token durante la devolución de llamada de omniauth y usándolo luego al llamar a fb_graph. Entonces podría ser algo como esto:
omniauth callback (aplicación / controladores / 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
Luego, cuando llame a fb_graph
@fb_user = FbGraph::User.new(''me'', access_token: session[:fb_access_token]).fetch
No sé si es la mejor manera, pero funciona hasta ahora.
Puedes hacerlo:
User.create!(:email => data.email, :password => Devise.friendly_token[0,20], :authentication_token => access_token.credentials.token)
También necesitarás agregar: authentication_token o lo que sea que hayas nombrado al attr_accessible
lo referiré a https://github.com/nov/fb_graph/wiki/Page-Management
donde nov dice: necesitas el token de acceso de la página para administrar tu página. Su token de acceso (de un usuario) no funciona aquí.
siga su enlace al sitio de desarrolladores de Facebook para obtener más información
necesitarás los usuarios access_token y lo hago a través de omniauth-facbook https://github.com/mkdynamic/omniauth-facebook
que recuperas el uso ingresando primero este inicializador en tu 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
(tenga en cuenta que puede cambiar los permisos en el alcance aquí, consulte los permisos de inicio de sesión de los desarrolladores de Facebook para obtener más información).
hay algunos funcionamientos internos para omniauth y omniauth-facebook, pero el momento es cuando recibes la devolución de llamada de Facebook tienes un hash omniauth de rack de la solicitud
omniauth = request.env["omniauth.auth"]
de eso se puede acceder al token de acceso de los usuarios como este
facebook_user_token = omniauth[''credentials''][''token'']
luego puede alimentar ese token en su llamada a la página fb_graph
page = FbGraph::Page.new(''FbGraph'').fetch(
:access_token => facebook_user_token,
:fields => :access_token
)
entonces simplemente podrá crear una nota llamando al método que desee sin una referencia al token de acceso
note = page.note!(:subject => @title, :message => @message, :link => @url)