2013-02-11 4 views
8

Ich erstelle eine API in Schienen für mobile Anwendung. Jetzt meldet sich der Benutzer mit Facebook an und ich erhalte den Zugriffstoken nach der Facebook-Authentifizierung. Ich muss dieses Zugriffstoken nehmen und prüfen, ob das Zugriffstoken in der Anwendungsdatenbank existiert. Wenn dies der Fall ist, erlauben Sie den Benutzerzugriff, wenn nicht, dann prüfen Sie auf E-Mail und aktualisieren Sie das Zugriffstoken und erlauben Sie den Benutzerzugriff.using omniauth für facebook login mit nur access token

Wie erreiche ich das mit omniauth-facebook und devise, soweit ich sehen kann omniauth-facebook tut alles von grund auf, kann keinen weg finden, nur access token zu omniauth-facebook zu stellen.

Jede Art von Hilfe wäre großartig.

Antwort

14

Sie brauchen nicht omniauth-facebook. Der Zweck dieses Edelsteins besteht lediglich darin, ein Zugriffstoken zu erhalten (und die Informationen des Benutzers abzufragen). Hier ist, wie die Dinge in einem Standard-Setup passieren (mit Devise und omniauth-facebook):

  • Omniauth erhält ein Zugriffstoken
  • Omniauth die Informationen des Benutzers abruft durch durch Facebook-API und speichert sie in der Umgebung des Anfrage
  • Omniauth ruft eine benutzerdefinierte Callback-Methode in der Anwendung, die Sie
  • Diese Callback-Methode ruft oder erstellt die Benutzer in der Datenbank schreiben müssen, dann ein paar Helfer von Devise vorgesehen verwendet in den Benutzer zu unterzeichnen.

(Devise's documentation about Omniauth für weitere Details)

Nun, da Sie bereits ein Zugriffstoken haben, und dass die sehr einfache Informationen aus Facebook-API des Benutzers zu holen ist, brauchen Sie nicht wirklich omniauth-facebook.

Alles, was Sie tun müssen, um eine Aktion zu schreiben:

  • erhalten das Zugriffstoken (als Parameter)
  • die Benutzer Informationen holen (ein Graph API Anfrage an /me)
  • Fund oder den Benutzer in der Datenbank erstellen (unter Verwendung des Facebook-ID des Benutzers)
  • die Benutzer melden Sie sich an Devise Helfer mit

Dieser Code basiert auf dem Beispiel in Devise's documentation.

class Users::FacebookCallbacksController 
    def facebook 
    # You should test if params[:access_token] is present 
    # and if this request fails 
    facebook_data = HTTParty.get("https://graph.facebook.com/me", query: { 
     access_token: params[:access_token] 
    }).parsed_response 

    # You need to implement the method below in your model (e.g. app/models/user.rb) 
    @user = User.find_for_facebook_oauth(facebook_data) 

    if @user.persisted? 
     sign_in_and_redirect @user, :event => :authentication #this will throw if @user is not activated 
     set_flash_message(:notice, :success, :kind => "Facebook") if is_navigational_format? 
    else 
     session["devise.facebook_data"] = facebook_data 
     redirect_to new_user_registration_url 
    end 
    end 
end 

Hinweise:

  • ich die HTTParty gem hier bin mit dem Facebook-API nennen, aber es gibt auch andere Möglichkeiten, einschließlich Koala
  • sign_in_and_redirect, set_flash_message und is_navigational_format? sind Helfer von Devise bereitgestellt
  • Für die Implementierung von User.find_for_facebook_oauth siehe Devise's documentation
  • Ein Edelstein namens devise_facebook_open_graph macht das Gleiche auf eine etwas andere Art und Weise.Es wird nicht wirklich verwendet oder beibehalten, aber Sie könnten von der Implementierung interessiert sein.
Verwandte Themen