Аутентификация веб-фрейма мобильного приложения c помощью устройства Rails
в настоящее время я работаю над реализацией мобильного приложения для нашего сайта, который использует Ruby on Rails и Devise. Идея здесь, во-первых, создать мобильную форму входа в систему, которая при успешном входе в систему открывает веб-фрейм, который аутентифицируется и позволяет нормально использовать (мобильный оптимизированный) сайт. Теоретически это возможно. У меня возникли проблемы со следующими вопросами:
Как вы получаете чистый ключ сеанса для сеанса пользователя через запрос json? Что? методы могут быть использованы для ручного создания его из devise, что-то, что
sign_in(:user, user)
метод?можно ли даже взять этот ключ и поместить его в cookie браузера, как это обычно происходит в devise, но на мобильной стороне?
Я знаю, что это не стандартный способ создания мобильных приложений для сайта, но я считаю, что это должно быть возможно.
4 ответов
вы можете рассмотреть возможность использования Разработать Маркер Auth и относиться к вашему мобильному приложению, как просто еще один веб-приложение, которое запрашивает разрешение с вашего основного сайта. DTA особенно хорош, поскольку он заботится об управлении токенами сеанса (обновление/истечение) и передаче их в приложение, требующее доступа. Проблема переопределяет контроллеры сеансов, чтобы он автоматически входил в систему после того, как вы уже вошли в мобильное приложение (или просто переписать вход, чтобы это произошло в сочетании с сайтом Rails, а не раньше). Учитывая, что вы уже используете Devise, это также может быть больше рефакторинга, чем вам хотелось бы.
Если вы хотите поместить форму аутентификации в мобильный пользовательский интерфейс и передать учетные данные в веб-фрейм, вам нужен способ передачи данных из мобильного приложения в веб-фрейм.
Как вы это сделаете, зависит от того, на какой платформе вы строите. Я не очень мобильный разработчик, поэтому я не знаю наверняка, насколько сложны / легки эти параметры:
- при открытии веб-фрейма создайте его экземпляр с данными сеанса
- найти способ позвонить методы на клиенте из веб-фрейма. Что-то вроде
getSessionData
. - вы можете сгенерировать отпечаток пальца для веб-фрейма, отправить эти данные на сервер, а затем аутентифицировать веб-фрейм с сервером, отправив отпечаток пальца.
опять же, я не совсем уверен, насколько возможны все эти варианты.
вы должны использовать авторизацию токенов и глубокую привязку 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
таким образом, мобильное приложение будет работать так:
- используйте универсальный веб-фрейм для отправки ajax-запросов на сервер и получения этого токена для электронной почты пользователя, если пароль верен.
- сделать/sign_in_with_token / #{токен из ajax}?email=#{base46 encoded email} ссылка внутри приложения.
- откройте эту ссылку внутри веб-фрейма и используйте приложение, как будто вы вошли в систему нормально. Теперь приложение может сохранять электронную почту и пароль локально и использовать эту логику, чтобы снова получить токен для другого сеанса. Позже вход в систему также сможет установить идентификатор приложения, чтобы можно было отправлять push-уведомления.
оцените любую обратную связь или критику по этому решению.