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