7

Rails 3 アプリで Facebook 認証に devise と omniauth-facebook を使用しました。このチュートリアルに基づいて、Facebook 認証を 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 answerを実装しようとしましたが、同じエラーに感じました: 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を参照してください

ページを管理するには、ページのアクセス トークンが必要です。あなたの (ユーザーの) アクセス トークンはここでは機能しません。

詳細については、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 に答える