12

Como parte de una API que estoy construyendo, hay un método de autenticación de usuario, que en caso de éxito, devuelve una carga útil de información del usuario útil, token de API, etc.Prueba HTTP Basic Auth en Rails 2.2 +

En la escritura funcional las pruebas para el controlador que maneja esto, me estoy ejecutando en un problema que prueba autenticación HTTP básica; He encontrado numerosos blogs que mencionan el siguiente código se debe utilizar para los encabezados falsos de un intento de autenticación:

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

El problema es que esto no tiene efecto; authenticate_with_http_basic no ve los encabezados y, por lo tanto, devuelve falso incluso en presencia de credenciales válidas.

¿Echo de menos algo?

Tenga en cuenta que la aplicación está congelada en Rails 2.2.2 si es útil para responder.

+2

Sólo quiero señalar que en el año 2011 y en Rails 3. * el código que ha comentado funciona perfectamente. – Arsen7

Respuesta

9

No estoy seguro de si esto ayuda, pero acabo de hacer una de estas pruebas en mi propia aplicación, excepto que estoy usando Rails 2.3.2.

En mi caso, la trampa era que había olvidado poner los accesorios para los usuarios, por lo que la contraseña criptada no coincidía (por qué tenía algún valor en absoluto sigue siendo un misterio para mí ... supongo que Rails no limpió la base de datos de prueba antes de ejecutar la prueba?)

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 
Cuestiones relacionadas