Аутентификация веб-сайта 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. Это позволит вам войти в веб-браузер и отправить токен в приложение через глубокую привязку.