2011-01-12 7 views
14

Voglio testare il servizio web dei miei binari usando cURL, eppure finora ho potuto farlo solo disattivando before_filter :authenticate_user!. Ma mi piacerebbe accedere a priori e quindi creare, distruggere ecc.Come si usa cURL per l'autenticazione su un'applicazione Rails che utilizza Devise?

Ho visto che con cURL puoi autenticare e salvare le informazioni di sessione in un cookie, che usi per le tue richieste successive, eppure non potevo t farlo funzionare con Devise: nel mio scenario, l'utente accede utilizzando una combinazione di indirizzo email/password, quindi sto cercando:

 
curl \ 
    -X POST \ 
    -d '[email protected]&password=password' \ 
    -c cookie \ 
    http://localhost:3000/users/sign_in > out 

e ottengo: ActionController::InvalidAuthenticityToken in Devise/sessionsController#create

qualcuno potrebbe darmi un'idea/un esempio?

Grazie!

risposta

23

Questo funziona:

autenticazione:

curl -H 'Content-Type: application/json' \ 
    -H 'Accept: application/json' \ 
    -X POST http://localhost:3000/users/sign_in \ 
    -d "{'user' : { 'email' : '[email protected]', 'password' : 'password'}}" \ 
    -c cookie

Mostra:

curl -H 'Content-Type: application/json' \ 
    -H 'Accept: application/json' \ 
    -X GET http://localhost:3000/pages/1.xml \ 
    -b cookie
+0

Questo funziona per le richieste GET, tuttavia, per le richieste POST non sembra funzionare. – Altonymous

+1

Ciò potrebbe essere dovuto al fatto che è necessario un token CSRF per richieste non GET in Rails 3 (http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/) – iainbeeston

+7

L'autenticazione stepped ha funzionato per me dopo aver cambiato le virgolette singole e doppie, ma non ho potuto accedere a nulla. – graywh

1

Hai provato qualcosa di simile (non testato):

curl --user name:password http://www.domain.com 
curl --user name:password -f 'key=value' http://www.domain.com 
+0

Invio i parametri del genere non soddisfa lo scenario dato neanche. –

4

Questo perché Rails per impostazione predefinita aggiunge un token di autenticità a forme di proteggere dalla contraffazione dolosa di parametri presentati. Poiché non fornisci questo token con la tua richiesta, i rail non lo accettano. È possibile ignorare questo con

skip_before_filter :verify_authenticity_token 

nel controller, in cui l'autorizzazione si svolge, meglio anche limitarlo all'azione di autorizzazione con: solo.

+0

Ho provato questo ma non funziona. – Martin

1

ottenuto il seguente answer from José Valim:

Se si dispone di un servizio web, accedi dovrebbe essere fatto utilizzando il protocollo HTTP Auth. Se non si specifica , l'opzione è disabilitare il token di autenticazione nella sessione , sebbene non sia raccomandato.