2009-07-24 14 views
17

Sto provando a scrivere una semplice app consumer OAuth in Rails. Sto usando Authlogic per la gestione dell'autenticazione e il plugin Authlogic OAuth per fare la cosa giusta.Creazione implicita dell'utente con plug-in Authlogic e Authlogic OAuth

Il plugin oauth fornisce un paio di helper per il rendering del pulsante di accesso: oauth_login_button e oauth_register_button. Insieme alle logiche di Authlogic e alla richiesta del plugin, questi due pulsanti creano in qualche modo la sessione/utente.

Quello che succede dopo è il seguente: - se utilizzo l'helper oauth_login_button, l'oggetto di sessione non riesce a salvare perché non c'è un utente locale. - se utilizzo l'helper oauth_register_button, quindi, in caso di accesso dopo il primo, Rails lamenta che il token è già stato acquisito ... il che significa che non è possibile creare la seconda copia per lo stesso utente, il che è giusto.

Il problema è: non voglio avere ENTRAMBI i pulsanti di registro e accesso sul mio sito.

Sul lato utente, quello che voglio ottenere è un singolo pulsante nella pagina iniziale, che dice smth. come "Accedi con Twitter", che l'utente deve fare clic per passare alle pagine interne del sito.

Sul lato server, voglio creare implicitamente l'account utente locale, se l'utente è un visitatore per la prima volta al mio sito.

Eventuali suggerimenti su come eseguire questa operazione?

Tutti i campioni in Authlogic + OAuth sono stato in grado di trovare non sembrano preoccuparsi di avere solo un singolo pulsante per l'accesso. :(

risposta

11

Sembra come ho intenzione di rispondere alla domanda io stesso.

io uso il seguente codice per generare il pulsante Accedi (in HAML):

- form_tag({:controller => "users", :action => "create"}, {:method => "post"}) do 
    = oauth_register_button :value => "Sign In with Twitter" 

e poi ho semplicemente creare l'oggetto sessione dell'utente nel metodo create della classe UsersController, se l'utente esiste già :

def create 
    @user = User.new(params[:user]) 
    @user.save do |result| # LINE A 
    if result 
     flash[:notice] = "Account registered!" 
     redirect_to some_inner_path 
    else 
     unless @user.oauth_token.nil? 
     @user = User.find_by_oauth_token(@user.oauth_token) 
     unless @user.nil? 
      UserSession.create(@user) 
      flash.now[:message] = "Welcome back!" 
      redirect_to some_inner_path   
     else 
      redirect_back_or_default root_path 
     end 
     else 
     redirect_back_or_default root_path 
     end 
    end 
    end 
end 

Se l'utente è un visitatore per la prima volta, l'oggetto utente viene salvato correttamente nella LINEA A. E se non lo è e c'è un token oauth disponibile, proviamo a recuperare l'utente dal DB e dal registro lui/lei in.

+0

Esattamente quello che stavo cercando. Grazie –

+0

questo è molto utile – Anurag

+0

Grazie mille :) –

Problemi correlati