2015-03-31 1 views
11

Une fonctionnalité courante pour les applications mobiles natives est la possibilité de rester connecté même si l'utilisateur ferme l'application en question (voir par exemple l'application Facebook sur iOS).Comment rester connecté même lorsque la force de l'utilisateur quitte l'application avec Ionic/Cordova?

Comment cela peut-il être réalisé pour une application Cordova/ionique/PhoneGap contre un back-end authentifiant Rails via nom d'utilisateur/mot de passe?

J'utilise la pierre précieuse de devise_token_auth pour faciliter l'authentification contre Rails si cela fait une différence.

+2

utilisation nom d'utilisateur et mot de passe ParamLogin localStorage.After dans localStorage et clair quand déconnecté. Si vous ne vous déconnectez pas et ne tuez pas l'application à chaque connexion, vérifiez que la valeur de votre clé localStorage est vide ou non, puis accédez à votre page. – Banik

+0

Vous ne devriez pas utiliser localStorage ... il serait beaucoup plus facile d'utiliser une base de données WebSQL en raison de la connexion à votre base de données Web. – Sithys

+0

@Sithys Bonne idée, mais malheureusement, WebSQL a été déprécié: http://programmers.stackexchange.com/questions/220254/why-is-web-sql-database-deprecated –

Répondre

6

Je pensais à cela récemment et je pense que j'ai une solution efficace. Je ne sais rien à propos de Rails mais l'idée devrait être transférée. Je n'ai que de l'expérience en Mongo pour une base de données alors supportez-moi.

Chaque périphérique a un identifiant unique qui peut être récupéré dans Cordova avec device.uuid (from the Cordova plugin) ou getUUID() (if you're using ngCordova). Cet identifiant n'est garanti que pour chaque plate-forme, bien qu'il soit susceptible d'être unique dans tous, vous devez donc ajouter la plate-forme et le modèle à votre identifiant unique pour faire bonne mesure.

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

Maintenant, nous avons créé un identifiant unique qui ne changera jamais et vous ne devez pas traiter avec le stockage local.

Maintenant, imaginez que vous ayez une collection ou un tableau de périphériques dans votre base de données qui ressemblent à ceci avec les paires valeur/clé suivantes. Maintenant, lorsque l'application démarre, récupérez le deviceId de l'appareil et envoyez-le à votre serveur pour le rechercher. Ce sera probablement différent pour vous, juste une simple recherche de valeur-clé.

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

En Mongo cela retournera un tableau des résultats, il ne devrait y avoir qu'un seul résultat. Maintenant, nous vérifions pour voir s'ils étaient précédemment connectés et récupérons l'userId.

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

S'ils étaient déconnectés avant ou s'il n'y avait aucun résultat, apportez-les à la page de connexion. S'ils étaient connectés, exécutez les procédures de connexion normales automatiquement. L'ID utilisateur peut être une sorte de pointeur vers un objet d'une autre collection.

Voici comment je pense que je le ferais, sinon vous pouvez avoir l'objet utilisateur avoir l'ID de l'appareil comme une clé, mais un utilisateur peut avoir plusieurs périphériques, donc il devrait être un tableau de clés, et je Je ne suis pas sûr de savoir comment le rechercher maintenant. Ajouter de nouveaux périphériques serait aussi simple que d'ajouter l'identifiant unique à la collection et de le pointer vers l'utilisateur.

Chaque fois que l'application s'ouvre, elle vérifie l'identifiant de l'appareil et voit si l'utilisateur est connecté sur l'appareil. Vous pouvez afficher un écran d'accueil pendant que cela se produit. Maintenant, si l'utilisateur sélectionne la déconnexion des paramètres, vous pouvez mettre à jour la base de données pour refléter cela et la prochaine fois qu'ils iront à l'application, ils seront déconnectés.

J'espère que mes pensées pourraient être utiles.Je pensais qu'il serait peut-être préférable de supprimer l'objet périphérique de la collection chaque fois qu'ils se déconnectent au lieu de simplement définir le logIn, de cette façon, s'ils se débarrassent de l'appareil, il ne restera pas dans votre collection. Je ne suis pas sûr de la façon dont la suppression des objets aura souvent un impact sur les performances de la base de données, mais les utilisateurs ne se déconnectent pas trop souvent des périphériques pour autant que je sache, cela ne devrait pas poser de problème.

Cela soulève cependant un autre point, les périphériques utilisés. Il s'agit toutefois d'une solution facile, chaque fois qu'un utilisateur se connecte sur un périphérique déjà existant, mettez à jour la clé userId pour le nouvel utilisateur s'il a été modifié.

AUTRE EDIT (parce que je ne peux pas commenter): Sur le stockage local/mise en cache et pourquoi c'est dangereux. La seule chose que vous pourriez consigner automatiquement dans un stockage local serait leurs identifiants de compte, qui sont des informations très sensibles et ne devraient jamais être stockées localement (les mots de passe ne devraient pas être stockés à distance, mais le hachage est un sujet séparé). Vous ne stockez jamais leur mot de passe dans le cache, vous pouvez créer une clé secrète et la stocker, mais tout ce qui est accessible localement peut être lu par quelqu'un et potentiellement répliqué sur un autre périphérique. Les informations d'identification de l'appareil seraient beaucoup plus difficiles à truquer.

+0

C'est trop d'effort juste pour rendre votre connexion persistante et cet événement ne fonctionnera pas si vous utilisent l'authentification basée sur des jetons dans l'API, car votre jeton ne durera jamais à la fin du serveur.Voici un meilleur magasin ces informations d'identification dans LocalStorage (ngStorage encore mieux) et chaque fois que l'utilisateur déjeune l'application s'authentifier derrière la scène si authentifié naviguez vers la page de désir ou naviguez vers la page de connexion qui a du sens. Seule l'heure à laquelle localstorage n'aura pas les informations d'identification de l'utilisateur est lors de la première connexion et lorsque l'utilisateur se déconnecte manuellement. –

4

Désolé, je suis incapable de commenter (besoin de 50 rep) mais je pense que l'utilisation de localStorage est une option valide ici. Vous pouvez créer un JSON Web Token (JWT) et le stocker dans le cache. Sur Android, à moins que vous n'effaciez explicitement le cache de votre application en accédant aux paramètres, l'application gardera votre utilisateur connecté (c'est-à-dire ne supprimera pas votre cache) même si vous l'arrêtez ou l'enlevez du volet multitâche . Je ne suis pas sûr comment cela fonctionne dans iOS.

Je recommande fortement ce amazing Cache Wrapper by jmdobry

En outre, il y a des incroyables bibliothèques tierces qui peuvent gérer l'authentification pour vous:

J'espère que ça aide! Bonne chance.

0

Pas très sûr, mais vous pouvez utiliser Cordova/JS amical localStorage ..

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

cela ne fonctionne pas dans android – AN11

+0

Essayez de cette façon: localStorage.email = "[email protected]"; localStorage.id = "56"; –