Получить пароль внутри authenticate_or_request_with_http_digest - PullRequest
1 голос
/ 15 июня 2011

У меня есть приложение, которое подключается к приложению 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 Ответ

1 голос
/ 17 июня 2011

Нашел ответ: у меня было принципиальное недопонимание того, как работает authenticate_or_request_with_http_digest: после прочтения документации (в исходном коде гема) я понял, что целью этого метода является , а не для выполнения аутентификации. его цель - предоставить строку «email: realm: password» браузеру, позволить браузеру зашифровать ее и проверить результат по его собственной рассчитанной (или кэшированной) версии.

Вот как я это настроил:

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
...