Аутентификация веб-сайта Mobile App с помощью Rails

В настоящее время я работаю над внедрением мобильного приложения для нашего сайта, который использует Ruby on Rails и Devise. Идея здесь состоит в том, чтобы сначала создать форму для входа в систему, которая при успешном входе в систему открывает веб-фрейм, который проходит проверку подлинности и разрешает обычное использование сайта (оптимизированного для мобильных устройств). Теоретически это должно быть возможно. У меня возникают проблемы со следующими проблемами:

  • Как вы получаете чистый ключ сеанса для сеанса пользователя с помощью запроса json? Какие методы могут быть использованы для его генерации вручную, что делает метод sign_in(:user, user)?

  • Можно ли даже взять этот ключ и поместить его в куки файл браузера, как обычно это происходит в разработке, но с мобильной стороны?

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

Ответ 1

ОК, поэтому я решил сделать решение для webframe следующим образом, в основном вы отправляете логин и пароль на определенный метод sign_in, специально разработанный для генерации одноразового знака в токенах для приложения. Для этого вам нужны два метода:

routes.rb

devise_scope :user do
  get "sign_in_with_token/:token" => "sessions#sign_in_with_token"
  post "get_login_token" => "sessions#get_login_token"
end

sessions_controller.rb(не забудьте добавить метод, который увеличивает fail_sign_in_count на неправильном пароле, в противном случае это может позволить атаки с грубой силой)

def get_login_token
  user = User.find_by_email(sign_in_params["login"])
  password = sign_in_params["password"]
  if user and user.valid_password?(password)
    token = SecureRandom.hex(16)
    user.update_attribute(:authentication_token, token)
    render json: {token: token}, status: 200
  else
    render json: {error: "error"}, status: 403
  end
end

и метод входа с этим токеном

def sign_in_with_token
  @user = User.where(authentication_token: params[:token], email: Base64.decode64(params[:email])).first
  if @user
    @user.update_attribute(:authentication_token, nil)
    sign_in(@user, bypass: true)
  end
  redirect_to '/' # or user_root_url
end

Таким образом, мобильное приложение будет работать следующим образом:

  • используйте общий веб-кадр для отправки ajax-запросов на сервер и получения этого токена для электронной почты пользователя, если пароль верен.
  • сделать ссылку /sign _in_with_token/# {токен из ajax}? email = # {base46 encoded email} в приложении.
  • открыть эту ссылку внутри веб-фрейма и использовать приложение, как если бы вы вошли в систему в обычном режиме. Теперь приложение может сохранять электронную почту и пароль локально и использовать эту логику, чтобы снова получить токен для другого сеанса. Более поздний вход в систему также сможет установить идентификатор приложения, чтобы можно было отправлять push-уведомления.

Оцените любые отзывы или критику этого решения.

Ответ 2

Возможно, вы захотите использовать Devise Token Auth и обработать свое мобильное приложение, как просто другое webapp, которое запрашивает разрешение с вашего основного сайта. DTA особенно приятен, так как он заботится об управлении токенами сеанса (обновлении/истечении срока действия) и передаче их в приложение, требующее доступа. Проблема заключается в переопределении ваших контроллеров сеансов, чтобы он автоматически входил в систему после того, как вы уже входите в мобильное приложение (или просто переписываете свой журнал, чтобы он встречался вместе с сайтом Rails, а не раньше). Учитывая, что вы уже используете Devise, это также может быть больше рефакторинга, чем вы хотели бы.

Ответ 3

Если вы хотите поместить свою форму аутентификации в мобильный интерфейс и передать учетные данные на веб-фрейм, вам нужен способ передачи данных из мобильного приложения в веб-фрейм.

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

  • При открытии веб-фрейма создайте его с помощью данных сеанса
  • Найдите способ вызова методов на клиенте из веб-фрейма. Что-то вроде getSessionData.
  • Вы можете создать отпечаток пальца для веб-фрейма, чтобы мобильный пользовательский интерфейс отправлял эти данные на сервер, а затем аутентифицировал веб-фрейм с сервером, отправив отпечаток.

Опять же, я не совсем уверен, насколько возможны все эти варианты.

Ответ 4

Вы должны использовать авторизацию на токен и глубокую привязку Android. Это позволит вам войти в веб-браузер и отправить токен в приложение через глубокую привязку.