Получить пароль внутри authenticate_or_request_with_http_digest
У меня есть приложение, которое подключается к приложению iphone, которое, в свою очередь, аутентифицирует своих пользователей через http_digest.
Я использую authlogic, и в моей схеме пользователи веб-сайта - "пользователи", а пользователи телефонного приложения - "люди". Итак, у меня есть user_sessions и people_sessions. Чтобы обработать http_digest auth, я использую метод authenticate_or_request_with_http_digest, например так:
def digest_authenticate_person
authenticate_or_request_with_http_digest do |email, password|
#ldb is just a logging method i have
ldb "email = #{email.inspect}, password = #{password.inspect}"
person = Person.find_by_email(email)
if person
ldb "Authentication successful: Got person with id #{person.id}"
@current_person_session = PersonSession.create(person)
else
ldb "Authentication failed"
@current_person_session = nil
end
return @current_person_session
end
end
Я вижу в журналах, что пароль равен nil: только электронная почта передается внутрь блока authenticate_or_request_with_http_digest.
Я проверяю это с помощью вызова curl следующим образом:
curl --digest --user fakename@madeup.xyz:apass "http://localhost:3000/reports.xml"
Я ожидаю, что "fakename@madeup.xyz" и "apass" будут переданы внутрь блока. Получив пароль, я могу использовать комбинацию адреса электронной почты и пароля, чтобы найти (или нет) пользователя обычным способом. Кто-нибудь знает, как я могу получить доступ к паролю?
благодарен за любой совет - макс
РЕДАКТИРОВАТЬ - при дальнейшем поиске в Google, я думаю, что я использую этот метод неправильно: я должен просто вернуть пароль или зашифрованный пароль. Но тогда как мне сравнить это с паролем, переданным как часть имени пользователя http_digest?
1 ответ
Нашел ответ: у меня было фундаментальное недоразумение о том, как работает authenticate_or_request_with_http_digest: после прочтения документации (в исходном коде гема) я понял, что цель этого метода не в том, чтобы выполнить аутентификацию, а в том, чтобы предоставить "электронную почту".: realm: пароль "строка для браузера, пусть браузер зашифрует его и проверит результат по его собственной расчетной (или кэшированной) версии.
Вот как я это настроил:
def current_person
if @current_person
@current_person
else
load_current_person
end
end
#use in before_filter for methods that require an authenticated person (mobile app user)
def require_person
unless current_person
redirect_to root_path
end
end
def load_current_person
#check user agent to see if we're getting the request from the mobile app
if request.env['HTTP_USER_AGENT'] =~ /MobileAppName/
result = digest_authenticate_person
if result == 401
return 401
elsif result == true
#make authlogic session for person
@current_person_session = PersonSession.new(@person_from_digest_auth)
@current_person = @person_from_digest_auth
end
end
end
#this method returns either true or 401
def digest_authenticate_person
authenticate_or_request_with_http_digest(Person::DIGEST_REALM) do |email|
person = Person.find_by_email(email)
@result = nil
if person
#need to send back ha1_password for digest_auth, but also hang on to the person in case we *do* auth them successfully
@person_from_digest_auth = person
@result = person.ha1_password
else
@person_from_digest_auth = nil
@result = false
end
@result
end
end