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.
fonte
2014-06-02 18:03:54