2012-05-03 17 views
6

Qualcuno può aiutarmi ad andare a fondo di questo problema?Perché il callback Devise + Omniauth non ha colpito il controller corretto?

Sto utilizzando Devise + Omniauth in un'applicazione Rails 3.2. Quello che voglio sapere è, cosa sta succedendo dietro le quinte con il metododi Devise.

Ho avuto uno scavare attraverso le rotte del rake e la fonte della gemma, ma non riesco a vedere nulla di ovvio che possa causare il problema che sto avendo.

Presumo che questo metodo chiama semplicemente l'URL di accesso del provider (ad esempio Twitter) e quindi torna al percorso di richiamata definito in routes.rb.

Nel mio routes.rb ho

devise_for :users, :controllers => { :omniauth_callbacks => 'users/omniauth_callbacks'} 

devise_scope :user do 
    get '/users/auth/:provider' => 'users/omniauth_callbacks#passthru' 
end 

Nel utenti/omniauth_callbacks_controller.rb ho

def twitter 
    render :text => "This works" 
end 

def passthru 
    render :text => "This doesn't work" 
end 

In vista ho <%= link_to "Twitter", user_omniauth_authorize_path(:twitter) %>. Cliccando su questo link si accede a Twitter, dove posso accedere, ma al ritorno alla mia app viene visualizzato un messaggio di errore "Sei già registrato".

Non riesco a capire come e perché questo errore viene generato. Dovrei vedere solo "Questo funziona" o "Questo non funziona".

Ho anche un provider di Facebook impostato esattamente allo stesso modo, e funziona come previsto.

Se si sostituisce il collegamento di omniauth di Devise con <a href="https://stackoverflow.com/users/auth/twitter">Twitter</a>, viene visualizzato "Funziona".

Quindi questo risolve il mio problema, ma non è l'ideale e mi piacerebbe sapere perché.

Qualcuno può far luce?

EDIT

percorsi Rake aspetto:

user_omniauth_callback  /users/auth/:action/callback(.:format)      users/omniauth_callbacks#(?-mix:twitter|facebook) 

risposta

1

Bene, si sta lavorando per me, quindi è sicuramente qualcosa da parte vostra. Prima di tutto, hai confrontato nella console il GET chiama /users/auth/twitter e /users/auth/twitter?callback ottenuto con 2 diversi metodi? Dovrebbero apparire esattamente uguali (ad eccezione del token e del verificatore, ovviamente).

Ora, non sono sicuro se questo è correlato, ma con idea non si utilizza un percorso passthru, quindi è possibile rimuovere quella rotta. Invece, nel tuo controller callbacks, dovresti implementare un'azione chiamata failure che gestisce una richiesta errata. per l'implementazione di Idea.

sto afferrare a cannucce qui, ma si dovrebbe anche avere questo alla fine del controller callback:

# This is necessary since Rails 3.0.4 
# See https://github.com/intridea/omniauth/issues/185 
# and http://www.arailsdemo.com/posts/44 
protected 
def handle_unverified_request 
    true 
end 
+0

hi askitaka, grazie per questi suggerimenti. Sto usando 'passthru' in base ai consigli https://github.com/plataformatec/devise/wiki/OmniAuth:-Overview e http://stackoverflow.com/questions/5531263/omniauth-doesnt-work-with-route -globbing-in-rails3 sulla rotta globbing. Non è più consigliabile? Ad ogni modo, mi hai dato alcune nuove cose a cui pensare. Grazie! Proverò questo e riferirò. –

+0

ciao ashitaka, potresti spiegare cosa intendi confrontando le chiamate GET. Ho eseguito 'app.get '/ users/auth/twitter'' nella console. Entrambe le chiamate restituiscono "302", che è normale. C'è un modo per esaminare queste chiamate in maggiori dettagli? O seguire il reindirizzamento 302? –

+0

Doh! Dopo aver pensato un po 'di più, hai ragione. Era la funzione passthru. Sto usando il passthru perché ho un problema tutto in routes.rb. Mentre lavoravo su qualcos'altro, avevo modificato questa funzione per rendere il testo come da mia domanda. Ma lo scopo di questo controller è di restituire un 404 su richieste omniauth. Senza la funzione passthru, omniauth semplicemente non funziona. Senti un po 'stupido ora :) Grazie per aver segnalato questo ashitaka! –

Problemi correlati