Подтвердить что ты не робот

Тестирование HTTP Basic Auth in Rails 2.2+

Как часть API, который я создаю, существует метод аутентификации пользователя, который после успеха возвращает полезную полезную информацию пользователя, маркер API и т.д.

При написании функциональных тестов для контроллера, который обрабатывает это, я запускаю пробную версию HTTP Basic auth; Я нашел множество блогов, в которых упоминается следующий код, который должен использоваться для обмана заголовков для попытки аутентификации:

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

Проблема в том, что это не имеет никакого эффекта; authenticate_with_http_basic не видит заголовки и поэтому возвращает false даже при наличии действительных учетных данных.

Я что-то пропустил?

Обратите внимание, что приложение было заморожено в Rails 2.2.2, если это полезно при ответе.

4b9b3361

Ответ 1

Я не уверен, помогает ли это, но я просто сделал один из этих тестов в своем приложении, за исключением того, что я использую Rails 2.3.2.

В моем случае ошибка заключалась в том, что я забыл вставить светильники для пользователей, поэтому crypted_password не совпал (почему это имело какое-то значение, все еще остается загадкой для меня... Я думаю, Rails didn 't очистить базу данных теста перед запуском теста?)

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 own unit tests
  def encode_credentials(username, password)
    "Basic #{ActiveSupport::Base64.encode64("#{username}:#{password}")}"
  end
end