12

Là một phần của một API Tôi đang xây dựng, có một phương pháp xác thực người dùng mà khi thành công, trả về một tải trọng của thông tin người dùng hữu ích, mã thông báo API vvkiểm tra HTTP Basic Auth trong Rails 2.2 +

Trong văn bản chức năng kiểm tra cho bộ điều khiển xử lý này, tôi đang chạy trong một vấn đề kiểm tra auth HTTP cơ bản; Tôi đã tìm thấy nhiều blog đề cập đến mã sau đây nên được sử dụng để giả mạo tiêu đề cho một nỗ lực xác thực:

@request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Basic.encode_credentials(email, pass) 

Vấn đề là điều này không có hiệu lực; authenticate_with_http_basic không thấy tiêu đề và do đó trả về sai ngay cả khi có thông tin đăng nhập hợp lệ.

Tôi có thiếu gì đó không?

Lưu ý rằng ứng dụng được đóng băng thành Rails 2.2.2 nếu ứng dụng đó hữu ích khi trả lời.

+2

Tôi muốn lưu ý rằng trong năm 2011 và trong Rails 3. * mã bạn đã trích dẫn hoạt động hoàn hảo. – Arsen7

Trả lời

9

Tôi không chắc liệu điều này có hữu ích hay không, nhưng tôi đã thực hiện một trong các thử nghiệm này trong ứng dụng của riêng mình, ngoại trừ tôi đang sử dụng Rails 2.3.2.

Trong trường hợp của tôi, sự thật là tôi đã quên đặt đồ đạc cho người dùng, vì vậy crypted_password không phù hợp (tại sao nó có giá trị nào vẫn là một bí ẩn đối với tôi ... Tôi đoán Rails không làm sạch cơ sở dữ liệu thử nghiệm trước khi chạy thử nghiệm?)

class DonglesControllerTest < ActionController::TestCase 
    fixtures :users 

    test "index api" do 
    @request.env['HTTP_AUTHORIZATION'] = encode_credentials('one', 'one') 

    get(:index, { :name_contains => 'XXXX0001', :format => 'json' }) 

    assert_equal 'application/json', @response.content_type 
    dongles = ActiveResource::Formats::JsonFormat.decode(@response.body) 

    expected_dongles = [ 
     { 'id' => 1, 
     'name' => 'XXXX0001', 
     'key_id' => 'usbstor\disk&ven_flash&prod_drive_sm_usb20&rev_1100\0000000000000000&0' } 
    ] 

    assert_equal expected_dongles, dongles 
    end 

    private 

    # verbatim, from ActiveController's own unit tests 
    def encode_credentials(username, password) 
    "BasiC#{ActiveSupport::Base64.encode64("#{username}:#{password}")}" 
    end 
end 
Các vấn đề liên quan