7

我在 Rails 3 应用程序中使用 devise 和 omniauth-facebook 进行 Facebook 身份验证,基于本教程:将 Facebook auth 添加到 Rails 3.1 应用程序,效果很好!

但现在我想在我的应用程序中完全集成 Facebook,通过它我可以访问用户的照片、朋友等,为此我正在考虑使用 fb_graph。fb_graph 需要一个令牌,我想知道如何编辑我的用户模型以保存令牌并在 fb_graph 中使用它。任何有关此事的帮助将不胜感激。

这就是我的用户模型现在的样子:

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
4

3 回答 3

9

你可以这样做:

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

您还需要将 :authentication_token 或您命名的任何内容添加到 attr_accessible

于 2012-04-11T10:01:06.920 回答
3

我一直在寻找同样的东西。我试图实施James Robey {s 的回答,但也遇到了同样的错误:OAuthException :: An active access token must be used to query information about the current user。然后我意识到 authentication_token 没有以这种方式保存。看了一段时间后,我在FbGraph + OmniAuth + Facebook Graph API on Rails 应用程序中发现了一种使用会话变量的方法,通过在omniauth 回调期间实现令牌保存,然后在调用 fb_graph 时使用它。所以它可能是这样的:

omn​​iauth 回调(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

然后在调用 fb_graph 时

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

我不知道这是否是最好的方法,但到目前为止有效。

于 2012-06-22T00:37:19.420 回答
1

我建议您参考https://github.com/nov/fb_graph/wiki/Page-Management

其中 nov 声明:您需要页面的访问令牌来管理您的页面。您(用户的)访问令牌在这里不起作用。

按照他的链接到 facebook 开发者网站了解更多信息

您将需要用户 access_token,我通过omniauth-facbook https://github.com/mkdynamic/omniauth-facebook执行此操作

您可以通过首先将此初始化程序输入到您的应用程序来检索使用情况

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

(请注意,您可以在此处更改范围的权限,检查 facebook 开发人员登录权限以获取更多信息

omn​​iauth 和 omniauth-facebook 有一些内部工作原理,但要点是当您从 facebook 收到回调时,您会从请求中获得机架 omniauth 哈希

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

从那里你可以像这样访问用户访问令牌

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

然后,您可以将该令牌输入您的 fb_graph 页面调用

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

那么您只需调用所需的方法即可创建便笺,而无需引用访问令牌

note = page.note!(:subject => @title, :message => @message, :link => @url)
于 2013-05-09T08:54:53.357 回答