2012-10-31 12 views
7

ho omniauth funzionare bene nei miei Rails 3 applicazione quando lo si utilizza come un link:Omniauth chiamata autorizzazione con l'Ajax

link_to("Connect Twitter", "/auth/twitter", :id => "connect-to-twitter") 

Ora io voglio chiamare '/ auth/twitter' attraverso l'Ajax. Tuttavia, nulla viene restituito dopo la fase di richiesta. Ecco l'ultima voce di registro:

Started GET "/auth/twitter" for 127.0.0.1 at 2012-10-30 17:53:02 -0700 
(twitter) Request phase initiated. 

Ecco il mio codice ajax (in CoffeeScript):

$("#connect-to-twitter").live("click", -> 
    alert('get twitter') 
    $.get('/auth/twitter', (data) -> 
    alert(data) 
) 
    return false 
) 

(So che questo problema è stato fatto prima di qui, ma non ho visto alcuna reale

+0

Ehi, hai ancora trovato una soluzione? Ho appena avuto lo stesso scopo anche se sto ancora lottando – JustBasti

+0

No, non l'ho mai capito. –

+0

Hmm, voglio solo bypassare usando l'API JS fb/twitter:/Anche se sembra che non sia possibile senza. – JustBasti

risposta

4

So che la domanda è un po 'vecchia ma ci risponderò comunque. Dopo aver affrontato il problema per e cercando di raggiungere lo stesso ciò che il PO intendeva ho fatto questo

ho scritto un middleware e inserito nel proprio sopra la Omniauth qui come il middleware guardare

class OmniAuthMiddleware 
    def initialize(app) 
    @app = app 
    end 

    def call(env) 
    status, headers, body = @app.call(env) 
    request = Rack::Request.new(env) 
    if request.xhr? and status == 302 and request.path_info =~ /\/auth\/\w+\z/ and body.class == Rack::BodyProxy 
     location = headers["Location"] 
     body = ActionDispatch::Response.new 
     headers = {'Content-Type'=>'text/javascript; charset=utf-8'} 
     body.body = ["window.location.href='#{location}'"] 
     body.headers = headers 
     status = 200 
    end 
    [status,headers,body] 
    end 
end 

Ed ecco come mi inserire dal middleware nel middleware stack di

Rails.application.config.middleware.insert_before OmniAuth::Builder,OmniAuthMiddleware 

Ecco come il mio stack middleware guardare

... 
... 
... 
use Warden::Manager 
use Rack::Mongoid::Middleware::IdentityMap 
use ExceptionNotifier 
use OmniAuthMiddleware 
use OmniAuth::Builder 
run PoasterApi::Application.routes 

Con questo sono stato in grado di realizzare ciò che volevo

Nota: non ho trovato alcuna informazione sulla roba ajax nel doc Omniauth e dato che stavo correndo contro il tempo, quindi, ho implementato questa correzione (dal momento che un la ricerca di google non mi ha mai dato una risposta favorevole). Potrebbe essere possibile che Omniauth supporti anche la risposta ajax, ma come detto non sono riuscito a trovarne uno nella documentazione. La risposta è per quegli utenti che desiderano implementare esattamente la stessa funzionalità ma non sono sicuro di come ottenerlo in Omniauth.

sto ancora guardando Omniauth per trovare se il loro esiste un modo per farlo direttamente in Omniauth impostando/tweaking la configurazione

Spero che questo aiuto

0

Due cose: in primo luogo, dal momento che si utilizza localhost, sarà necessario impostare il numero di porta (supponendo 3000), quindi l'endpoint dovrebbe essere localhost: 3000. In secondo luogo, devi anche impostare un reindirizzamento, che dovrebbe anche essere localhost: 3000.