Я создаю основной API, где информация о пользователе может быть получена после того, как вход в систему и пароль того пользователя правильно отправляются.
Прямо сейчас я использую что-то вроде этого:
http://foo:bar@example.com/api/user.xml
Так, что я должен сделать, доступ пользователь/пароль, отправленный в запросе ( foo
и bar
) но не уверено, как получить доступ к той информации в контроллере направляющих.
Тогда я проверил бы те переменные через быстрое User.find
и затем набор те как переменные имени пользователя и пароля для authenticate_or_request_with_http_basic
.
Возможно, что я смотрю на это в абсолютно неправильном пути, но это - то, где я в прямо сейчас.:)
Ответ на ваш вопрос о том, как получить учетные данные из запроса:
user, pass = ActionController::HttpAuthentication::Basic::user_name_and_password(request)
Однако Authenticate_or_request_with_http_basic - это все, что вам нужно для базовой аутентификации:
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, если учетные данные не предоставлены, что откроет диалоговое окно имени пользователя / пароля в браузере. Если указаны подробности, они передаются в указанный блок. Если блок возвращает истину, запрос проходит. В противном случае обработка запроса прерывается, и клиенту возвращается статус 403.
Вы также можете проверить Railscast 82 (это был приведенный выше код): http://railscasts.com/episodes/82-http-basic-authentication
Плагин 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
Я бы посмотрел немного дальше, куда это все ведет, но мне пора спать. Надеюсь, я был полезен.