2011-01-12 1 views
14

Ich möchte meine Rails-Web-Service mit cURL testen, aber bisher konnte ich es nur deaktivieren before_filter :authenticate_user! deaktivieren. Aber ich möchte mich a priori anmelden und dann erstellen, zerstören etc.Wie verwenden Sie cURL zur Authentifizierung in einer Rails-Anwendung, die Devise verwendet?

Ich sah, dass mit cURL Sie die Session-Informationen in einem Cookie authentifizieren und speichern können, die Sie für Ihre folgenden Anfragen verwenden, aber ich konnte nicht t es mit Devise funktioniert: in meinem Szenario der Benutzer sich mit der E-Mail/Passwort-Kombination, so versuche ich:

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

und ich bekomme: ActionController::InvalidAuthenticityToken in Devise/sessionsController#create

Könnte mir jemand eine Idee geben,/ein Beispiel?

Danke!

Antwort

23

Dies funktioniert:

Authentifizieren:

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

Show:

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

Dies funktioniert für GET-Anforderungen, für POST-Anfragen scheint es jedoch nicht zu funktionieren. – Altonymous

+1

Das könnte sein, weil Sie ein CSRF-Token für Non-GET-Anforderungen in Rails 3 benötigen (http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails /) – iainbeeston

+7

Die Authentifizierung funktioniert für mich, nachdem ich die einfachen und doppelten Anführungszeichen gewechselt habe, aber auf nichts zugreifen konnte. – graywh

1

Haben Sie so etwas wie dies versucht (nicht getestet):

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

die Parameter wie das Senden nicht den vorgegebenen Szenario entweder erfüllen. –

4

Dies liegt daran, Rails standardmäßig ein Echtheitstoken Formen fügt vor bösartigen Fälschung der eingereichten Parameter zu schützen. Da Sie dieses Token nicht mit Ihrer Anfrage angeben, akzeptiert rails es nicht. Sie können dies umgehen mit

skip_before_filter :verify_authenticity_token 

in Ihrem Controller, wo Autorisierung stattfindet, noch besser mit ihm die Genehmigung Aktion zu begrenzen: nur.

+0

Ich habe das versucht, aber es funktioniert nicht. – Martin

1

Haben Sie die folgende answer from José Valim:

Wenn Sie einen Web-Service haben, melden Sie sich an sollten mit HTTP Auth erfolgen. Wenn nicht, ist Ihre Option, Authentizitätstoken auf der Sitzung Form zu deaktivieren, obwohl nicht empfohlen.