12

내가 구축하고있는 API의 일부로서 기능 서면으로 사용자 인증 등의 성공에 유용한 사용자 정보, API 토큰의 페이로드를 반환하는 방법,테스트 HTTP 기본 인증은 2.2

있다 이것을 처리하는 컨트롤러에 대한 테스트, 나는 HTTP Basic auth 테스트 문제를 실행 중이다. 나는 다음과 같은 코드가 인증 시도에 대한 스푸핑 헤더에 사용되어야 언급 다수의 블로그를 발견 :

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

문제이 아무런 효과가 없다는 것입니다; authenticate_with_http_basic은 유효한 자격 증명이있는 경우에도 헤더를 표시하지 않으므로 false를 반환합니다.

내가 누락 된 항목이 있습니까?

답변이 유용 할 경우 앱이 Rails 2.2.2로 고정됩니다.

+2

나는 2011 년과 3 번째 레일에 주목하고 싶다. * 인용 한 코드는 완벽하게 작동한다. – Arsen7

답변

9

이것이 도움이되는지 확신 할 수 없지만, 레일즈 2.3.2를 사용하고 있다는 것을 제외하고는 내 애플리케이션에서이 테스트 중 하나를 만들었습니다.

내 경우에는 함정이 사용자를위한 비품을 넣는 것을 잊었 기 때문에 crypted_password가 일치하지 않았습니다 (왜 모든 값을 가지고 있었는지는 여전히 내 신비입니다 ...) Rails

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