Написание теста / метода для дайджест-аутентификации HTTP
Как написать метод, который будет использоваться в тестировании rspec для доступа к страницам, требующим имени пользователя и пароля для дайджест-аутентификации HTTP. Например, этот тест...
it "edit" do
http_login
post :edit, id: @post
assigns[:post].should eq(@post)
end
потребности http_login
способ быть примерно таким...
def http_login
user = {"username" =>
Digest::MD5.hexdigest(["username","Application","password"].join(":"))}
request.env['HTTP_AUTHORIZATION'] =
ActionController::HttpAuthentication::Digest.encode_credentials(?,?,?,?)
end
Мой вопрос заключается в том, что я должен указать в четырех аргументах для кодирования учетных данных. Аргументы будут http_method, credentials, password, password_is_ha1
но я не уверен, как писать http_method
а также credentials
реализовать в тестах.
2 ответа
Решение
Решение здесь: https://gist.github.com/1282275
переписан здесь для потомков
# Adds support for http digest authentication in Rails 3
# Inspired by: http://lightyearsoftware.com/2009/04/testing-http-digest-authentication-in-rails/
# Place this code in test/test_helper.rb
# In your test, call authenticate_with_http_digest prior to calling get, post, put or delete
# Tested with Rails 3.0.7
class ActionController::TestCase
require 'digest/md5'
def authenticate_with_http_digest(user = API_USERNAME, password = API_PASSWORD, realm = API_REALM)
ActionController::Base.class_eval { include ActionController::Testing }
@controller.instance_eval %Q(
alias real_process_with_new_base_test process_with_new_base_test
def process_with_new_base_test(request, response)
credentials = {
:uri => request.url,
:realm => "#{realm}",
:username => "#{user}",
:nonce => ActionController::HttpAuthentication::Digest.nonce(request.env['action_dispatch.secret_token']),
:opaque => ActionController::HttpAuthentication::Digest.opaque(request.env['action_dispatch.secret_token'])
}
request.env['HTTP_AUTHORIZATION'] = ActionController::HttpAuthentication::Digest.encode_credentials(request.request_method, credentials, "#{password}", false)
real_process_with_new_base_test(request, response)
end
)
end
end
Вот решение для проверки подлинности HTTP-дайджеста RSpec 3.1 и Rails 4: https://gist.github.com/murbanski/6b971a3edc91b562acaf