2012-04-05 6 views
6

Rails 3.0.12, il più recente omniauth, posso collegarmi a Google e ottenere l'indirizzo email dell'utente correttamente. Ma poi ho eseguito, che lo stesso rotaie app dietro nginx in modalità SSL, e non riesce con la pagina di Google:Omniauth e open_id con Google si sono interrotti quando si è eseguito dietro nginx in modalità SSL

"The page you requested is invalid." 

E 'la mia nginx config? La mia configurazione di omniauth?

So che lo X-Forwarded-Proto: https è la salsa speciale qui, c'è qualcos'altro che devo fare per ottenere l'openid felice dietro un server web SSL?

Ecco il codice di esempio completo: è possibile clonare questo repository, bundle install ed eseguire rails s per vederlo funzionare correttamente, quindi eseguire rake server per vederlo fallire. https://github.com/jjulian/open_id_ssl

nginx.conf:

worker_processes 2; 
pid  tmp/nginx.pid; 
error_log log/error.log; 
daemon  off; 

events { 
} 

http { 
    client_body_temp_path tmp/body; 
    proxy_temp_path  tmp/proxy; 
    fastcgi_temp_path  tmp/fastcgi; 
    uwsgi_temp_path  tmp/uwsgi; 
    scgi_temp_path  tmp/scgi; 

    server { 
    listen 3000 ssl; 
    ssl_certificate  development.crt; 
    ssl_certificate_key development.key; 
    ssl_verify_depth  6; 

    access_log log/access.log; 
    proxy_buffering off; 
    location/{ 
     proxy_pass  http://127.0.0.1:3300; 
     proxy_set_header X-Real-IP  $remote_addr; 
     proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
     proxy_set_header Host    $http_host; 
     proxy_redirect off; 
     proxy_set_header X-Forwarded-Proto https; 
    } 
    } 
} 

omniauth.rb inizializzatore:

require 'openid/store/filesystem' 

Rails.application.config.middleware.use OmniAuth::Builder do 
    provider :open_id, :identifier => 'https://www.google.com/accounts/o8/id' 
end 

routes.rb:

OpenIdSsl::Application.routes.draw do 
    match '/auth/open_id/callback' => 'accounts#update' 
    match '/auth/failure' => 'accounts#failure' 
    root :to => 'accounts#show' 
end 

UPDATE: Questo esempio utilizzato Rails 3.1. 12 e OmniAuth 1.0.3. L'aggiornamento a Rails 3.1.4 e OmniAuth 1.1.0 risolve il problema.

+0

Sei sicuro che Google non colpisca il tuo server? se stai usando un certificato di prova, forse Google rifiuta di usarlo. Vorrei eseguire un tcpdump per verificare se è stato effettuato un tentativo di connessione prima di andare oltre. – Schmurfy

+0

Google non "colpisce" mai il server locale - l'app genera un reindirizzamento del browser a un URL non valido. Prova il codice di esempio che ho pubblicato, viene eseguito immediatamente. –

risposta

2

trovato il vostro problema, sto ancora cercando di trovare qualcosa di più pulito, ma qui è la rapida correzione & sporca:

aggiungere questo nei vostri config/inizializzatori/omniauth.rb:

class Rack::OpenID 
    def realm_url(req) 
    'https://localhost:3000' 
    end 
end 

Ed ora per la spiegazione: quando la gemma di open-rack crea la richiesta da inviare al server openID di google fallisce in un punto usando l'url di accesso all'applicazione rails e non quello di nginx (che usa ssl) risultando in questo essere inviato al server openid :

openid.realm:http://localhost:3001 
openid.return_to:https://localhost:3001/auth/open_id/callback 

Il dominio usa l'url http (rails url) mentre il return_to punta alla destra https url (nginx), quando il server openid vede questo si ferma e restituisce un errore.

PS: modificherò la risposta se riesco a trovare un modo più pulito.

+0

La tua risposta mi ha portato a scavare più a fondo nel codice Rack e OmniAuth, e dopo aver visto che REQUEST_URI era "http" durante la fase di richiesta, ho scavato nel codice Rails. Questo mi ha fatto provare Rails 3.1 (il mio esempio era 3.0) e con l'aggiornamento a OmniAuth 1.1.0, è tutto risolto! Ottieni la taglia - grazie per avermi indicato nella giusta direzione. –

+0

sembra che io fossi un po 'in ritardo per la taglia, ma sono felice di poter aiutare :) – Schmurfy

0

Molto probabilmente è necessario configurare l'URL di richiamata dell'app google per aggiungere https anziché http.

Ho installato più app uno per test con rails s e un'altra distribuzione di gestione temporanea e un altro per quando distribuisco in produzione.

+0

Prova a eseguire il server - https://github.com/jjulian/open_id_ssl Google non riesce nemmeno a richiamare la mia app, costruisce un url iniziale non valido. –

Problemi correlati