web-dev-qa-db-fra.com

Comment gérer la session d'un utilisateur connecté depuis une application mobile en PHP?

Je suis un programmeur PHP de profession. Donc, je n'ai aucune idée sur iOS et le codage Android.

Le scénario est qu'il y a un site Web développé en utilisant un réseau social PHP logiciel intitulé "PHPFox".

Il existe maintenant deux applications mobiles similaires qui reproduisent exactement les fonctionnalités de ce site Web. Une application mobile est sous iOS et une autre sous Android.

J'ai donc écrit un ensemble d'API RESTful dans lequel j'accepte la demande de l'application mobile, analyse la demande, passe les paramètres de la demande à la fonction qui effectue le même travail pour le site Web, récupère la réponse de cette fonction, convertit-la. au format JSON et renvoyé à l'application mobile. Pour iOS et Android app, j'utilise le même ensemble de REST API.

Lorsque l'utilisateur se connecte, l'API de connexion REST est appelée. Finalement, la fonction d'authentification PHPFox est appelée, un jeton de sécurité est généré avec d'autres données utilisateur. À chaque connexion, un jeton de sécurité différent est généré par PHPFox.Ces données sont définies dans la session.Maintenant, chaque fois que j'appelle l'une des fonctions par le biais d'un fichier d'API REST), le jeton de sécurité généré au moment de la connexion est vérifié et uniquement sur vérification réussie du jeton, la fonction PHPFox est appelée. Ce processus de vérification est effectué en interne par PHPFox, il n’est donc pas nécessaire de transmettre le jeton de sécurité explicitement ou implicitement à un appel API REST.

Jusqu'à présent, tout fonctionne parfaitement.

Mon doute commence à partir d'ici. Je ne sais pas si la session est maintenue dans l'application iOS/Android. Donc, si la session sur le serveur, c'est-à-dire que PHPFox a expiré, qu'adviendra-t-il de l'application? Est-ce que ça va planter? L'utilisateur devra-t-il se connecter à nouveau? Si l'utilisateur tue l'application sur l'appareil et revient à l'application, est-ce qu'il/elle doit refaire le processus de connexion?

Il y a trop de doutes dans mon esprit. Je suis totalement confus avec ces choses.

Quelqu'un peut-il s'il vous plaît mettre plus l'accent sur le problème que je fais face? Ce serait vraiment bien si vous pouviez expliquer en détail.

Merci.

41
PHPLover

REST est sans session pour sa nature. Vous devez générer un jeton lorsque l'utilisateur est connecté. Vous devez enregistrer ce jeton sur votre client mobile. Pour chaque demande, vous devez attacher un jeton valide dans l'en-tête de la demande et le vérifier côté serveur. Si le jeton expire, le jeton stocké sur un client n'est pas valide. Donc, vous devez vous reconnecter à cause de la réponse 401. Si le jeton n'est pas correct, vous devez répondre 400. J'espère que je vous aiderai.

54
valeriocomo

Contrairement aux navigateurs Web, les applications iOS et Android ne peuvent pas gérer de sessions. En règle générale, une fois qu'un utilisateur s'est connecté (informations de connexion vérifiées à partir du serveur), ses informations de connexion sont enregistrées côté client. données du serveur utilisant la session less REST appels api. C’est ainsi que cela se fait généralement dans les applications mobiles.

Cependant, si vous voulez que la session serveur et l'application mobile aillent de pair (ce qui, à mon avis, n'est pas une bonne idée), la

1) Lorsque l'utilisateur se connecte, un jeton de sécurité est généré côté serveur et enregistré à la fois côté serveur et côté client.

2) L'application mobile pourra communiquer avec le serveur tant que le jeton de sécurité est valide.

3) À l'expiration de la session, le jeton de sécurité devient invalide. Maintenant, le serveur et le client doivent comprendre la réponse à l'expiration de la session. L'application mobile doit maintenant rediriger l'utilisateur vers la page de connexion. L'utilisateur se reconnectera puis communiquera avec le serveur. Cela devrait se produire chaque fois que la session est expirée.

20
Fawad Masud

Si vous utilisez Oauth 2 pour l’authentification, voici la configuration commune:

  • L'utilisateur se connecte sur l'application mobile
  • Si les informations d'identification sont correctes, le serveur renvoie le jeton d'accès, un jeton d'actualisation et la durée de vie du jeton.
  • L'application mobile stocke ces valeurs + horodatage actuel
  • Du côté du serveur, un ramasse-miettes est configuré pour effacer les jetons expirés.
  • Avant de passer un appel api, l'application mobile vérifie si le jeton est sur le point d'expirer (à l'aide des valeurs stockées). Si le jeton est sur le point d'expirer, l'application envoie le jeton d'actualisation qui demande au serveur de générer un nouveau jeton d'accès.
  • Si vous souhaitez que les utilisateurs restent connectés, l'application peut être configurée pour vérifier périodiquement le jeton d'accès et en demander un nouveau s'il est périmé.

J'espère que cela t'aides.

À votre santé

15
Valéry

Votre serveur doit être complètement sans état et aucune session ne doit donc être stockée. A REST L'API est en réalité simplement une couche d'abstraction de données avec une sécurité optionnelle (par jeton)

Ainsi, votre API expose un service d'authentification, qui répondra avec un jeton d'autorisation à utiliser lors des demandes suivantes en tant qu'en-tête. Ce jeton doit être une relation 1to1 avec chaque utilisateur et universellement unique. Il doit également avoir un délai d'expiration, moment auquel votre serveur répond avec une réponse d'erreur appropriée demandant à votre application d'actualiser le jeton, ce qui peut être effectué via un système de jeton d'actualisation distinct, ou demandant à l'utilisateur de se reconnecter pour actualiser le jeton. .

C'est l'APP qui doit conserver l'état, pas le serveur. Le serveur est simplement là pour les données, et ne doit donc pas s'appuyer sur un type d'authentification basé sur une session.

8
RaggaMuffin-420

Ne vous inquiétez pas de la session du côté développement mobile. Je ne connais pas grand chose à propos de iOS, mais dans Android, nous utilisons SharedPrefrence (indicateur qui maintient la session localement).

4
Puneet Ahuja

Une session est "quelque chose" qui vit sur le serveur. Il peut s'agir d'un objet stockant des détails sur l'utilisateur (par exemple, l'identifiant de session, le nom d'utilisateur, l'adresse électronique, etc.) ou toute autre donnée nécessaire au traitement des demandes futures (telles que les détails du panier d'achat, l'adresse de livraison, etc.).

Ce "quelque chose" est typiquement un objet, qui peut être stocké en mémoire, dans une base de données ou même sérialisé et sauvegardé dans le système de fichiers (je crois que c'est la valeur par défaut en PHP).

Alors, quand vous dites "Je ne sais pas si la session est maintenue dans l'application iOS/Android", j'ai bien peur que cela n'ait aucun sens. Seul le serveur peut gérer des sessions.

Généralement, la seule chose que le client sait (navigateur Web ou application mobile) est l'identifiant de session (sous la forme d'un jeton ou d'un GUID). C’est la seule chose dont le client/l’application doit se souvenir et qui doit être envoyé avec toute demande adressée au serveur.

Il pourrait être stocké en tant que cookie et/ou envoyé au serveur en tant qu'en-tête de requête.

Ensuite, le serveur lira l'identifiant de session/le jeton à partir des cookies ou de l'en-tête et récupérera les détails de la session à l'emplacement où il stockera les sessions (système de fichiers, mémoire ou base de données). C'est ce qui se passe derrière la scène lorsque vous appelez session_start().

Pour en savoir plus sur la gestion de session et sur la création d'un gestionnaire de session personnalisé (qui peut être nécessaire dans votre cas pour obtenir un jeton à partir des en-têtes de demande):
http://php.net/manual/en/function.session-start.php

3
Alex Sanséau

Je n'ai aucune expérience de travail avec PHPFox, mais voici comment une interface mobile devrait idéalement gérer les problèmes:

Cas 1: application mobile en communication active avec le serveur:

  • Le délai d'expiration de la session ne cesse d'augmenter et la session reste active.

Cas 2: application mobile active sans aucune communication avec le serveur (par exemple, appel téléphonique entrant, déplacement entre applications, etc.):

  • La session du serveur peut ou non expirer.
  • S'il expire, la requête suivante sur le serveur échouera avec auth et renverra une erreur.
  • L'application utilise cette erreur et redirige normalement vers l'écran de connexion avec un message toast invitant l'utilisateur à se connecter. (Cela se produit dans mon application bancaire)

Cas 3: l'utilisateur supprime l'application sur l'appareil et la relance:

  • L'application doit stocker le jeton dans sqllite ou dans des préférences partagées. (Les applications toujours connectées adoptent cette approche)
  • Lors du redémarrage, l'application peut interroger le serveur avec le jeton permanent.
  • Si la session est active, la communication est établie et l'utilisateur peut continuer. Sinon, l'utilisateur se connecte à l'écran de connexion comme dans le cas 2.
3
Sanand Sule