Как оставаться в системе, даже когда пользовательский пользователь покидает приложение с помощью Ionic/Cordova?

Общей функциональностью для собственных мобильных приложений является возможность оставаться в системе, даже если пользователь закрывает приложение, о котором идет речь (см., например, приложение Facebook в iOS).

Как это может быть достигнуто для приложения Cordova/Ionic/PhoneGap, аутентифицирующего сервер Rails через имя пользователя/пароль?

Я использую devise_token_auth gem, чтобы упростить аутентификацию с Rails, если это имеет значение.

Ответ 1

Я думал об этом в последнее время, и я думаю, что у меня есть эффективное решение. Я ничего не знаю о Rails, но идея должна быть передана. У меня только опыт в Mongo для базы данных, так что несите меня.

Каждое устройство имеет уникальный идентификатор, который можно получить в Кордове с помощью device.uuid(из плагина Cordova) или getUUID() (если вы используете ngCordova). Этот идентификатор гарантированно будет уникальным для каждой платформы, хотя он, вероятно, будет уникальным для всех, поэтому вы должны добавить платформу и модель в свой уникальный идентификатор для хорошей оценки.

var deviceId = device.platform + device.model + device.uuid;

Теперь мы создали действительно уникальный идентификатор, который никогда не изменится, и вам не придется иметь дело с локальным хранилищем.

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

{
    device: DEVICEID;
    loggedIn: true;
    userId: USERID;
}

Теперь, когда приложение запускает захват deviceId с устройства и отправляет его на ваш сервер для его поиска. Это, вероятно, будет отличаться для вас, просто простой поиск по ключевым словам.

var result = Devices.find({device: deviceId}).fetch();

В Mongo это вернет массив результатов, но должен быть только один результат. Теперь мы проверяем, были ли они ранее зарегистрированы и захватили userId.

var loggedIn = result[0].loggedIn;
var user = result[0].userId;

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

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

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

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

Надеюсь, мои мысли помогут.

EDIT: Я думал, что лучше удалить объект устройства из коллекции каждый раз, когда они выходят из системы, а не просто устанавливать loggedIn, таким образом, если они избавятся от устройства, он не останется в вашей коллекции. Я не уверен, что удаление объектов часто будет влиять на производительность базы данных, но пользователи не слишком часто выходят из устройства, насколько я могу судить, поэтому это не должно быть слишком большой проблемой.

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

ДАЛЬНЕЙШЕЕ ИЗОБРАЖЕНИЕ (потому что я не могу комментировать): На локальном хранилище/кэшировании и почему это опасно. Единственное, что вы могли бы в локальном хранилище автоматически регистрировать кого-либо в автоматическом режиме, - это учетные данные учетной записи, которые являются очень конфиденциальной информацией и никогда не должны храниться локально (пароли не должны храниться удаленно, но хеширование - отдельный вопрос). Вы никогда не сохранили бы свой пароль в кеше, вы могли бы составить какой-то секретный ключ и хранить его, но все, что доступно локально, может быть прочитано кем-то и потенциально реплицировано на другое устройство. Информация об идентификаторе устройства будет намного сложнее подделать.

Ответ 2

Извините, я не могу комментировать (нужно 50 rep), но я думаю, что использование localStorage является допустимым вариантом здесь. Вы можете создать JSON Web Token (JWT) и сохранить его в кеше.

На Android, если вы явно не очистите кеш своего приложения, выбрав "Настройки", приложение будет поддерживать вход пользователя (т.е. не убивать ваш кеш), даже если вы принудительно остановите его или удалите из панели многозадачности. Я не уверен, как это работает в iOS.

Я очень рекомендую эту удивительную упаковку кеша jmdobry

Кроме того, есть удивительные сторонние библиотеки, которые могут обрабатывать аутентификацию для вас:

Надеюсь, это поможет! Удачи.

Ответ 3

Не очень безопасно, но вы можете использовать дружественную локальную локацию Cordova/JS..

if ( logged_in_successfully ) {
  localStorage.setItem("email", email)
  localStorage.setItem("password", password)
}