2013-02-11 13 views
8

sto creando un'API in rotaie per cellulari. Ora l'utente effettuerà il login usando facebook e riceverò l'autenticazione token post facebook. Devo prendere questo token di accesso e controllare se il token di accesso esiste nel database delle applicazioni. In tal caso, consentire l'accesso utente, in caso contrario, controllare la posta elettronica e aggiornare il token di accesso e consentire l'accesso dell'utente.usando omniauth per Facebook Login con un solo token di accesso

Come faccio a farlo con omniauth-facebook e ideare, per quanto posso vedere omniauth-facebook fa tutto da zero, non riesce a trovare un modo per fornire solo token di accesso a omniauth-facebook.

Qualsiasi genere di aiuto sarebbe grande.

risposta

14

Non è necessario omniauth-facebook. Lo scopo di questa gemma è solo quello di ottenere un token di accesso (e interrogare le informazioni dell'utente). Ecco come le cose accadono in una configurazione standard (con Devise e omniauth-facebook):

  • Omniauth ottiene un token di accesso
  • Omniauth recupera informazioni dell'utente attraverso attraverso API e negozi di Facebook che nell'ambiente del richiesta
  • Omniauth chiama un metodo di callback personalizzato nella vostra applicazione che è necessario scrivere
  • Questo metodo di callback recupera o crea l'utente nel database, quindi utilizza un paio di aiutanti forniti da Devise di firmare l'utente.

(vedi Devise's documentation about Omniauth per maggiori dettagli)

Ora, dal momento che si dispone già di un token di accesso, e che andare a prendere le informazioni dell'utente dal API di Facebook è molto semplice, in realtà non hanno bisogno omniauth-facebook.

Tutto quello che dovete fare è scrivere un'azione da:

  • ricevere il token di accesso (come parametro)
  • prendere l'informazioni degli utenti (una richiesta Graph API per /me)
  • find o creare l'utente nel database (utilizzando Facebook id dell'utente)
  • firmare l'utente nell'utilizzo aiutanti di Devise

Questo codice è basato sull'esempio fornito 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 

Note:

  • Sto utilizzando la HTTParty gem qui per chiamare l'API di Facebook, ma ci sono altre possibilità, tra cui Koala
  • sign_in_and_redirect, set_flash_message e is_navigational_format? sono aiutanti forniti da Devise
  • Fare riferimento alla Devise's documentation per l'attuazione del User.find_for_facebook_oauth
  • Un gioiello chiamato devise_facebook_open_graph fa la stessa cosa in un modo leggermente diverso.Non è realmente utilizzato o mantenuto, ma potresti essere interessato all'implementazione.
Problemi correlati