Как заставить rails 3 работать в качестве бэкенда для мобильных приложений с поддержкой session_id в запросе? - PullRequest
6 голосов
/ 07 апреля 2011

Я пытаюсь собрать рельс 3 для мобильного приложения.Однако я новичок в создании приложений на rails 3.

Пользователям потребуется сеанс на сервере, но у меня нет поддержки обычных файлов cookie, поэтому мне нужно будет отправлять session_id вместе с каждым запросом.

Какую систему аутентификации я должен использовать в рельсах 3, есть ли драгоценный камень?

Я читал, что в рельсах 2 можно было установить session_id из URL, но этофункция снята с рельсов 3 из-за проблем безопасности.Это правда?Если есть способ сделать это, мне очень интересно, несмотря на возможные дыры в безопасности.

Ответы [ 2 ]

1 голос
/ 06 апреля 2012

Обновление

Небольшое обновление: у Devise больше нет authentication_token, поскольку его реализация была сочтена слишком небезопасной.Хорошей альтернативой является предложение Брайана Отона .

Краткое изложение его метода заключается в том, что он генерирует ключ authentication_key AND authentication_secret в отдельной модели.Затем вы аутентифицируетесь, посылая свой ключ и секрет, если совпадение найдено, вы временно входите в систему как пользователь.

В контроллере приложения это выглядит так:

class ApplicationController < ActionController::Base
  before_filter :authenticate_from_token

  protected

  def authenticate_from_token
    if current_token.try :authenticatable
      sign_in token.authenticatable, store: false
    end
  end

  def current_token
    AuthenticationToken.find_authenticated({
      secret: (params[:secret] || request.headers[:secret]),
      secret_id: (params[:secret_id] || request.headers[:secret_id]),
    })
  end
end

authenticatable токена в этом случае является моделью пользователя или любой другой вещью, которая была сделана аутентифицируемой (токены полиморфны).Как вы можете видеть, его легко настроить для работы с Devise.

Мне очень нравится этот метод, и он реализован в недавнем API.Читайте об этом на его веб-сайте.

Старый ответ

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

Кроме того, я могу заново генерировать токен при каждом вызове или при каждом «сеансе».

1 голос
/ 19 апреля 2011

Обычно я бы использовал HTTP Digest аутентификацию для решения этой проблемы.Большинство плагинов аутентификации Rails (таких как Authlogic, возможно, Devise) будут поддерживать HTTP Basic или дайджест-аутентификацию через плагин.Таким образом, вам не нужно беспокоиться о просроченных cookie-файлах и тому подобном.

Вы также можете передать параметр api_key вместо идентификатора сеанса.

Во многих случаях я использовал ключ api в качестве основного имени пользователя HTTP.Это дает чистые URL и аутентификацию без сессий.

Проблема безопасности, о которой вы, вероятно, имеете в виду, это Подделка межсайтовых запросов .Это действительно настоящая проблема.Поэтому вы скрываете действия с побочными эффектами (создание, обновление, уничтожение) за формами с помощью токена CSRF.В противном случае вредоносная ссылка может выполнять непреднамеренные действия с сайтом, на котором вы уже прошли аутентификацию, без необходимости знать свои учетные данные.

Пока ваш ключ API не может быть легко обнаружен кем-либо в автоматическом режиме,риск должен быть минимальным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...