2015-03-31 2 views
11

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

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

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

+2

использование localStorage.After логин установить имя пользователя и пароль в LocalStorage и очистить его, когда вышли из системы. Если вы не выходите из системы и не убиваете приложение при каждом входе в систему, проверьте, что значение ключа localStorage пусто или нет, а затем перейдите на страницу. – Banik

+0

Вы не должны использовать localStorage ... было бы намного проще использовать базу данных WebSQL из-за подключения к вашей веб-базе данных. – Sithys

+0

@Sithys Хорошая идея, но, к сожалению, WebSQL устарел: http://programmers.stackexchange.com/questions/220254/why-is-web-sql-database-deprecated –

ответ

6

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

Каждое устройство имеет уникальный идентификатор, который можно получить в Кордове с помощью устройства. (from the Cordova plugin) или getUUID() (if you're using 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; 

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

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

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

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

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

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

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

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

+0

Это слишком много усилий, чтобы сделать ваше постоянство входа и это событие неработающим, если вы используют аутентификацию на основе токенов в API, потому что ваш токен не будет длиться вечно на сервере.Здесь лучше хранить эти учетные данные в LocalStorage (ngStorage еще лучше), и каждый раз, когда пользователь обедает, приложение аутентифицируется за сценой, если аутентифицировано, перейдите на страницу желаний или перейдите на страницу входа, которая имеет смысл. Только время вашего локального хранилища не будет иметь учетных данных пользователя во время первого входа в систему и когда пользователь выйдет из системы вручную. –

4

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

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

Я очень рекомендую этот amazing Cache Wrapper by jmdobry

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

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

0

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

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

это не работает в android – AN11

+0

Попробуйте этот способ: localStorage.email = "[email protected]"; localStorage.id = "56"; –

Смежные вопросы