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

Rails: доступ к имени пользователя/паролю, используемому для HTTP Basic Auth?

Я создаю базовый API, в котором информация пользователя может быть восстановлена ​​после правильного отправки имени пользователя и пароля.

Сейчас я использую что-то вроде этого:

http://foo:[email protected]/api/user.xml

Итак, мне нужно сделать доступ к пользователю/паролю, отправленному в запросе (foo и bar), но я не уверен, как получить доступ к этой информации в контроллере Rails.

Затем я бы проверил эти переменные с помощью быстрого User.find, а затем установил их как переменные имени пользователя и пароля для authenticate_or_request_with_http_basic.

Возможно, я смотрю на это совершенно неправильно, но там, где я сейчас.:)

4b9b3361

Ответ 1

Ответ на ваш вопрос о том, как получить учетные данные из запроса, следующий:

user, pass = ActionController::HttpAuthentication::Basic::user_name_and_password(request)

Однако authenticate_or_request_with_http_basic - это все, что вам нужно сделать с помощью базового auth:

class BlahController < ApplicationController
  before_filter :authenticate

  protected

  def authenticate
    authenticate_or_request_with_http_basic do |username, password|
      # you probably want to guard against a wrong username, and encrypt the
      # password but this is the idea.
      User.find_by_name(username).password == password
    end
  end
end

authenticate_or_request_with_http_basic вернет статус 401, если учетные данные не будут предоставлены, что вызовет диалог имени пользователя и пароля в браузере. Если даны данные, они передаются в предоставленный блок. Если блок возвращает true, запрос проходит. В противном случае обработка запроса прерывается, и статус клиента возвращается к клиенту.

Вы также можете проверить Railscast 82 (это был код, приведенный выше): http://railscasts.com/episodes/82-http-basic-authentication

Ответ 2

Плагин rails Authlogic поддерживает эту функциональность (а также многое другое) из коробки. Вы можете использовать его в источнике или просто интегрировать в существующее приложение.

Edit:
После копания исходного кода для Authlogic я нашел этот файл, который использует следующий фрагмент кода, чтобы захватить имя пользователя и пароль:

  def authenticate_with_http_basic(&block)
    @auth = Rack::Auth::Basic::Request.new(controller.request.env)
    if @auth.provided? and @auth.basic?
      block.call(*@auth.credentials)
    else
      false
    end
  end

Я бы посмотрел немного дальше, где все идет, но я должен лечь спать. Надеюсь, я помог.