Аутентификация веб-фрейма мобильного приложения c помощью устройства Rails

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

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

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

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

4 ответов


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


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

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

  1. при открытии веб-фрейма создайте его экземпляр с данными сеанса
  2. найти способ позвонить методы на клиенте из веб-фрейма. Что-то вроде getSessionData.
  3. вы можете сгенерировать отпечаток пальца для веб-фрейма, отправить эти данные на сервер, а затем аутентифицировать веб-фрейм с сервером, отправив отпечаток пальца.

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


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


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

маршруты.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 (не забудьте добавить метод, который увеличивает failed_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

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

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

оцените любую обратную связь или критику по этому решению.