7

Tôi đã sử dụng devise và omniauth-facebook trong ứng dụng Rails 3 của mình để xác thực Facebook, dựa trên hướng dẫn này: Adding Facebook auth to Rails 3.1 app và nó hoạt động tốt!Mã thông báo truy cập từ xác định + xác thực omniauth-facebook để sử dụng trong fb-graph

Nhưng bây giờ tôi muốn tích hợp Facebook đầy đủ trong ứng dụng của mình, tôi có thể truy cập ảnh, bạn bè, v.v. của người dùng và tôi nghĩ đến việc sử dụng fb_graph. fb_graph yêu cầu mã thông báo và tôi muốn biết cách chỉnh sửa mô hình người dùng của mình để lưu mã thông báo và sử dụng nó trong fb_graph. Bất kỳ trợ giúp nào về vấn đề này sẽ được đánh giá cao.

Đây là cách mô hình tài khoản của tôi trông giống như ngay bây giờ:

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

Hãy [xem này] (http://facebook-developer.net/2008/08/ 05/tối ưu hóa cơ sở dữ liệu của bạn-bảng-cho-facebook-connect /). Tạo mô hình 'Facebook' và lưu trữ trong bảng đó nhưng tôi không chắc đó là cách tốt nhất. : P – Rafaiel

Trả lời

9

Bạn có thể làm điều này:

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

Bạn cũng sẽ cần phải thêm: authentication_token hoặc bất cứ điều gì bạn đặt tên nó vào attr_accessible

+0

Cảm ơn bạn rất nhiều! Nó đã làm việc. Bạn là một người tiết kiệm cuộc sống. – humairatasnim

+1

Vấn đề duy nhất tôi đang gặp phải là mã thông báo hết hạn. Tôi đã hủy đăng ký ứng dụng từ facebook của mình cho mục đích thử nghiệm và giờ tôi cố gắng tự ủy quyền lại, tôi nhận được lỗi này: 'OAuthException :: Mã thông báo truy cập hoạt động phải được sử dụng để truy vấn thông tin về người dùng hiện tại' Có cách nào tôi không có thể làm mới mã thông báo mỗi khi người dùng đăng nhập vào ứng dụng của tôi để tránh mã thông báo bị hết hạn? – humairatasnim

+0

Có thể tạo một phương thức trong mô hình người dùng gọi self.authentication_token = nil; self.save; trong thời gian làm đẹp. Không chắc chắn cách xử lý này. Trong một vài ngày tôi có thể sẽ. –

3

Tôi đang tìm kiếm điều tương tự. Tôi đã cố gắng thực hiện câu trả lời của James Robey và cảm nhận cùng một lỗi: OAuthException :: An active access token must be used to query information about the current user. Sau đó, tôi nhận ra authentication_token đã không được lưu theo cách này. Sau khi tìm một thời gian tôi tìm thấy trong FbGraph + OmniAuth + Facebook Graph API on Rails application một cách để làm điều đó với các biến phiên, bằng cách thực hiện tiết kiệm mã thông báo trong cuộc gọi lại omniauth và sau đó sử dụng nó khi gọi fb_graph. Vì vậy, nó có thể là một cái gì đó như thế này:

callback omniauth (app/controllers/người dùng/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 

Sau đó, khi gọi fb_graph

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

Tôi không biết nếu nó cách tốt nhất, nhưng hoạt động cho đến nay.

+0

cảm ơn bạn đã trả lời. Tôi có một câu hỏi bổ sung - cách xử lý mã thông báo làm mới ở trên? – BKSpurgeon

1

ốm giới thiệu bạn đến https://github.com/nov/fb_graph/wiki/Page-Management

nơi Tháng Mười Một nói: Bạn cần mã thông báo truy cập của trang để quản lý trang của bạn. Mã thông báo truy cập của bạn (của người dùng) không hoạt động ở đây.

theo liên kết của mình để trang web phát triển facebook để biết thêm

bạn sẽ cần những người sử dụng access_token và tôi làm điều này thông qua omniauth-facbook https://github.com/mkdynamic/omniauth-facebook

mà bạn lấy việc sử dụng bằng cách đầu tiên nhập initializer này vào ứng dụng của bạ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 

(lưu ý bạn có thể thay đổi các điều khoản trên phạm vi ở đây kiểm tra các nhà phát triển facebook login quyền để biết thêm

có một số hoạt động bên trong để omniauth và omniauth-facebook nhưng jist là khi bạn nhận được gọi lại từ facebook bạn có một rack omniauth băm từ yêu cầu

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

từ đó đã có thể truy cập các người dùng truy cập dấu hiệu như thế này

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

sau đó bạn có thể ăn token vào cuộc gọi trang fb_graph bạn

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

sau đó bạn sẽ chỉ đơn giản là có thể tạo ghi chú bằng cách gọi phương pháp mong muốn của bạn mà không có một tài liệu tham khảo để access token

note = page.note!(:subject => @title, :message => @message, :link => @url) 
Các vấn đề liên quan