Rails: доступ к имени пользователя/паролю, используемому для HTTP Basic Auth?
Я создаю базовый API, в котором информация пользователя может быть восстановлена после правильного отправки имени пользователя и пароля.
Сейчас я использую что-то вроде этого:
http://foo:[email protected]/api/user.xml
Итак, мне нужно сделать доступ к пользователю/паролю, отправленному в запросе (foo
и bar
), но я не уверен, как получить доступ к этой информации в контроллере Rails.
Затем я бы проверил эти переменные с помощью быстрого User.find
, а затем установил их как переменные имени пользователя и пароля для authenticate_or_request_with_http_basic
.
Возможно, я смотрю на это совершенно неправильно, но там, где я сейчас.:)
Ответы
Ответ 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
Я бы посмотрел немного дальше, где все идет, но я должен лечь спать. Надеюсь, я помог.