Использование простых текстовых паролей с authenticate_or_request_with_http_digest - PullRequest
0 голосов
/ 17 сентября 2011

Я немного застрял, пытаясь быстро запустить и запустить HTTP Digest-аутентификацию, во многом как в руководстве:

HTTP Digest Authentication"> Руководства по Ruby on Rails: обзор контроллера действий> Аутентификация дайджеста HTTP

class ApplicationController < ActionController::Base
  protect_from_forgery

  USERS = { "sam" => "ruby" }

  before_filter :authenticate

private
  def authenticate
    authenticate_or_request_with_http_digest do |username|
      USERS[username]
    end
  end
end

У меня запрашивают имя пользователя и пароль, хотя при вводе вышеизложенного аутентификация кажется неудачной, и мне снова предлагают. Поэтому я начал копаться в коде, который подтверждает запрос здесь:

validate_digest_response"> GitHub: http_authentication.rb> validate_digest_response

  def validate_digest_response(request, realm, &password_procedure)
    secret_key  = secret_token(request)
    credentials = decode_credentials_header(request)
    valid_nonce = validate_nonce(secret_key, request, credentials[:nonce])

    if valid_nonce && realm == credentials[:realm] && opaque(secret_key) == credentials[:opaque]
      password = password_procedure.call(credentials[:username])
      return false unless password

      method = request.env['rack.methodoverride.original_method'] || request.env['REQUEST_METHOD']
      uri    = credentials[:uri][0,1] == '/' ? request.fullpath : request.url

     [true, false].any? do |password_is_ha1|
       expected = expected_response(method, uri, credentials, password, password_is_ha1)
       expected == credentials[:response]
     end
    end
  end

Я не вижу, как он обрабатывает пароль как обычный текст. Как устанавливается password_is_ha1 ? Я также немного озадачен тем, как работает блок any? , который может не помочь: - /

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

Огромное спасибо за всю вашу помощь заранее: -D

1 Ответ

0 голосов
/ 08 июля 2012

Метод any? действует как collect, за исключением того, что возвращает true в первый раз, когда его блок возвращает true.Здесь он действует как цикл над массивом [true, false]:

  1. Блок сначала запускается с password_is_ha1, установленным на true.Если блок возвращает true, any? немедленно возвращает true, и, поскольку это последний оператор validate_digest_response, метод в целом возвращает true.

  2. В противном случае блок запускается снова с password_is_ha1, установленным на false.Если блок возвращает true, any? немедленно возвращает true, и, поскольку это последний оператор validate_digest_response, метод в целом возвращает true.

  3. Если ни один из этих прогонов не вернул true, any? вернет false.Поскольку это последний оператор validate_digest_response, метод в целом возвращает false.

Таким образом, эффект этой строки заключается в том, что сначала предполагается, что это хешированный пароль, иесли он действителен, то предположите, что это открытый текстовый пароль, и проверьте, действителен ли он.Другой, более многословный, способ написать это был бы:

   expected = expected_response(method, uri, credentials, password, true)
   return true if expected == credentials[:response]

   expected = expected_response(method, uri, credentials, password, false)
   return true if expected == credentials[:response]

   return false
...