2012-04-06 24 views
19

Tôi sử dụng authenticate_user của devise! phương pháp trong một bộ điều khiển. Đây là hoạt động tốt khi auth_token cung cấp trong yêu cầu là điều đúng nhưng nếu thẩm định thất bại, tôi kết thúc với:Làm thế nào để loại bỏ chuyển hướng html trong devise authenticate_user

curl -XGET 'http://localhost:3000/my_obj?auth_token=wrongtoken' 

<html><body>You are being <a href="http://localhost:3000/users/sign_in">redirected</a>.</body></html> 

Như tôi đã sử dụng rabl, cách tốt nhất để có một cái gì đó giống như

là gì
{'error' : 'authentication error'} 

trả về nội dung chuyển hướng html?

Trả lời

41

tôi làm điều đó trong tránh các bộ lọc với: format =>: phản ứng json và làm bộ lọc của riêng tôi để làm cho phản ứng JSON của tôi nếu không có CURRENT_USER qua

class MyController < ApplicationController 
    before_filter :authenticate_user!, :unless => { request.format == :json } 
    before_filter :user_needed, :if => { request.format == :json } 

    def user_needed 
    unless current_user 
     render :json => {'error' => 'authentication error'}, :status => 401 
    end 
    end 
end 

Một cách khác, có thể là sạch hơn là xác định FailureApp của riêng bạn (https://github.com/plataformatec/devise/blob/master/lib/devise/failure_app.rb)

class MyFailureApp < Devise::FailureApp 
    def respond 
    if request.format == :json 
     json_failure 
    else 
     super 
    end 
    end 

    def json_failure 
    self.status = 401 
    self.content_type = 'application/json' 
    self.response_body = "{'error' : 'authentication error'}" 
    end 
end 

Trong lập mưu của tập tin cấu hình add:

config.warden do |manager| 
    manager.failure_app = MyFailureApp 
end 
+0

Tôi đã thử phương pháp thứ hai để tránh phải lặp lại cùng một mã trong tất cả các bộ điều khiển của mình. Tôi đã tạo lớp MyFailureApp thành lib/failure.rb và thay đổi cấu hình. Tôi không quản lý để có nó làm việc mặc dù, tôi nhận được '!! Lỗi không mong muốn trong khi xử lý yêu cầu: hằng số không khởi tạo MyFailureApp '. Bất kỳ ý tưởng tại sao anh chàng này không được tải? – Luc

+0

Bạn cần yêu cầu tệp của mình yêu cầu 'lỗi' ở đầu cấu hình Devise – shingara

+0

(tôi ngớ ngẩn) Tuyệt vời, điều đó hoạt động tốt. Cảm ơn. – Luc

32

Trong các phiên bản mới hơn của lập mưu (Tôi đang sử dụng 2.2.0), bạn có thể sử dụng navigational_formats tùy chọn trong tập tin cấu hình lập mưu, devise.rb:

# ==> Navigation configuration 
# Lists the formats that should be treated as navigational. Formats like 
# :html, should redirect to the sign in page when the user does not have 
# access, but formats like :xml or :json, should return 401. 
# 
# If you have any extra navigational formats, like :iphone or :mobile, you 
# should add them to the navigational formats lists. 
# 
# The "*/*" below is required to match Internet Explorer requests. 
config.navigational_formats = ["*/*", :html] 

Chừng nào :json không có trong danh sách đó, và yêu cầu của bạn kết thúc bằng .json, nó sẽ hoạt động như bạn muốn.

+2

Điều này đã giúp tôi tiết kiệm thời gian đáng kinh ngạc, cảm ơn bạn! –

+0

Tôi đã bối rối cả ngày cho đến khi tôi thấy quan điểm của bạn về yêu cầu kết thúc bằng .json. Chương trình hay, chương trình hay. –

+2

Thêm 'ứng dụng/json' vào' Tiêu đề' của yêu cầu và bạn không cần '.json' ở cuối url. – rmagnum2002

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