7

Użyłem devise i omniauth-facebook w mojej aplikacji Rails 3 do uwierzytelniania Facebooka, na podstawie tego samouczka: Adding Facebook auth to Rails 3.1 app i działa dobrze!Dostęp do tokena z uwierzytelniania + omniauth-facebook do użycia w fb-wykresie

Ale teraz chcę mieć pełną integrację z Facebookiem w mojej aplikacji, dzięki której mam dostęp do zdjęć użytkownika, przyjaciół itp., A do tego mam zamiar użyć fb_graph. fb_graph wymaga tokena i chciałem wiedzieć, jak edytować mój model użytkownika, aby zapisać token i użyć go w fb_graph. Każda pomoc w tej sprawie będzie bardzo ceniona.

ten sposób mojego modelu użytkownika wygląda teraz:

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

Chodźmy [zobacz] (http://facebook-developer.net/2008/08/ 05/optimize-your-database-tables-for-facebook-connect /). Utwórz model 'Facebook' i zapisz w tym stole, ale nie jestem pewien, czy to najlepszy sposób. : P – Rafaiel

Odpowiedz

9

Można to zrobić:

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

Będziesz również dodać: authentication_token lub cokolwiek nazwał ją do attr_accessible

+0

Dziękuję bardzo! Zadziałało. Jesteś ratownikiem życia. – humairatasnim

+1

Jedynym problemem, z którym teraz borykam się jest to, że token wygasa. Usunąłem autoryzację aplikacji z mojego facebooka w celach testowych, a teraz, kiedy próbuję ponownie autoryzować siebie, pojawia się ten błąd: 'OAuthException :: Aktywny token dostępu musi być użyty do zapytania informacji o bieżącym użytkowniku' Czy jest jakikolwiek sposób czy odświeżać tokena za każdym razem, gdy użytkownik loguje się do mojej aplikacji, aby uniknąć utraty ważności tokena? – humairatasnim

+0

Być może utwórz metodę w modelu użytkownika, która wywołuje self.authentication_token = nil; self.save; podczas deauth. Nie wiem, jak sobie z tym poradzić. Za kilka dni prawdopodobnie to zrobię. –

3

Szukałem tego samego. Próbowałem wprowadzić James Robey {s odpowiedź i poczułem do tego samego błędu: OAuthException :: An active access token must be used to query information about the current user. Wtedy zdałem sobie sprawę, że authentication_token nie został zapisany w ten sposób. Po pewnym czasie znalazłem w FbGraph + OmniAuth + Facebook Graph API on Rails application sposób na zrobienie tego ze zmiennymi sesji, poprzez zaimplementowanie zapisu tokena podczas wywołania omniauth, a następnie użycie go podczas wywoływania fb_graph. Więc może to być coś takiego:

omniauth zwrotna (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 

Następnie podczas wywoływania fb_graph

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

Nie wiem, czy to najlepszy sposób, ale działa do tej pory.

+0

dziękuję za odpowiedź. Mam dodatkowe pytanie - w jaki sposób powyższy uchwyt odświeżyć tokeny? – BKSpurgeon

1

źle odnoszą się do https://github.com/nov/fb_graph/wiki/Page-Management

gdzie listopada stwierdza: Trzeba token dostępu dla strony, aby zarządzać swoją stronę. Tuken dostępu użytkownika (użytkownika) tutaj nie działa.

śledzić jego odnośnik do programistów stronie facebook uzyskać więcej informacji

musisz użytkownicy access_token i zrobić to poprzez omniauth-facbook https://github.com/mkdynamic/omniauth-facebook

którym odzyskać korzystania przez pierwsze wprowadzenie do tego inicjatora Twoja aplikacja

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 

(zauważyć można zmienić uprawnienia w zakresie tutaj sprawdzić programiści Facebook login uprawnienia więcej

istnieją pewne wewnętrzne funkcjonowanie do omniauth i omniauth-facebook ale jist jest kiedy dostaniesz zwrotnego z facebook masz zębatkę omniauth skrótu z wniosku

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

z który można uzyskać dostęp do dostępu użytkowników żeton jak ten

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

można potem karmić tokenu do swojej fb_graph widoku rozmowy

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

wtedy po prostu być w stanie utworzyć notatkę wywołując pożądany sposób bez odniesienia do token dostępu

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