2011-01-12 39 views
14

Tôi muốn kiểm tra dịch vụ web đường ray của mình bằng cách sử dụng cURL, nhưng cho đến nay tôi chỉ có thể thực hiện điều đó trong khi hủy kích hoạt before_filter :authenticate_user!. Nhưng tôi muốn đăng nhập vào một ưu tiên và sau đó tạo ra, phá hủy vvLàm thế nào để bạn sử dụng cURL để xác thực trên một ứng dụng Rails sử dụng Devise?

Tôi thấy rằng với cURL bạn có thể xác thực và lưu thông tin phiên trong cookie mà bạn sử dụng cho các yêu cầu sau của mình, nhưng tôi không thể t làm cho nó làm việc với lập mưu: trong kịch bản của tôi, người dùng đăng nhập sử dụng một sự kết hợp email/mật khẩu, vì vậy tôi đang cố gắng:

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

và tôi nhận được: ActionController::InvalidAuthenticityToken in Devise/sessionsController#create

ai đó có thể cho tôi một ý tưởng/một ví dụ?

Cảm ơn!

Trả lời

23

này hoạt động:

Authenticate:

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

Hiển thị:

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

Điều này làm việc cho các yêu cầu GET, tuy nhiên, đối với các yêu cầu POST, nó có vẻ không hoạt động. – Altonymous

+1

Đó có thể là do bạn cần mã thông báo CSRF cho các yêu cầu không được gửi trong Rails 3 (http://weblog.rubyonrails.org/2011/2/8/csrf-protection-bypass-in-ruby-on-rails/) – iainbeeston

+7

Xác thực được thực hiện cho tôi sau khi tôi chuyển đổi các dấu nháy đơn và kép, nhưng không thể truy cập bất kỳ thứ gì. – graywh

1

Các bạn đã thử một cái gì đó như thế này (không kiểm tra):

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

gửi các thông số như vậy không đáp ứng các kịch bản cho một trong hai. –

4

Điều này là do Rails theo mặc định thêm một thẻ xác thực với các hình thức bảo vệ từ giả mạo độc hại của các thông số nộp. Vì bạn không cung cấp mã thông báo này với yêu cầu của mình, đường ray không chấp nhận nó. Bạn có thể bỏ qua điều này với

skip_before_filter :verify_authenticity_token 

trong điều khiển của bạn, nơi cho phép diễn ra, tốt hơn thậm chí để hạn chế nó vào hành động uỷ quyền với: chỉ.

+0

Tôi đã thử điều này nhưng nó không hoạt động. – Martin

1

Got the answer from José Valim sau:

Nếu bạn có một dịch vụ web, đăng nhập nên được thực hiện sử dụng HTTP Auth. Nếu không, tùy chọn của bạn là tắt mã thông báo xác thực trên phiên biểu mẫu, mặc dù không được khuyến nghị.

Các vấn đề liên quan