2010-05-06 5 views
1

Je veux apprendre tous les détails de l'authentification des applications Web. J'ai donc décidé d'écrire une bibliothèque d'authentification CodeIgniter à partir de zéro. Maintenant, je dois prendre une décision de conception sur la façon de déterminer si un utilisateur est connecté.Comment vérifier si l'utilisateur se connecte dans une application Web?

Fondamentalement, après la saisie de l'utilisateur nom d'utilisateur & paire de mots de passe. Un cookie est défini pour cette session, les navigations suivantes dans l'application Web ne nécessitent pas de nom d'utilisateur & password. Le côté serveur vérifiera si le cookie de session est valide pour déterminer si l'utilisateur actuel est connecté. La question est: comment déterminer si le cookie est un cookie valide émis du côté serveur?

Je peux illustrer le moyen le plus simple est d'avoir la valeur de cookie stockée dans l'état de la session ainsi. Pour chaque requête HTTP, comparez la valeur du cookie et celle de la session du serveur. (Puisque la bibliothèque de session CodeIgniter stocke les variables de session dans les cookies, elle ne s'applique pas sans un certain ajustement.) Cette méthode nécessite un stockage côté serveur.

Pour une application Web volumineuse déployée dans plusieurs centres de données. Il est possible que l'utilisateur saisisse le mot de passe & lors de la navigation dans un centre de données, alors qu'il accède plus tard à l'application Web dans un autre centre de données. Le comportement attendu est que l'utilisateur vient d'entrer le nom d'utilisateur & mot de passe une fois. Par conséquent, tous les centres de données devraient pouvoir accéder à l'état de la session. Cela est possible sans objet même le statut de la session est stocké dans un stockage externe tel qu'une base de données.

J'ai essayé Google. Je me connecte à Google avec un proxy asiatique qui est censé me diriger vers des datacenters en Asie. Ensuite, je passe à un proxy nord-américain qui devrait me diriger vers les centres de données en Amérique du Nord. Il reconnaît ma connexion sans demander à nouveau le nom d'utilisateur et le mot de passe. Donc, y a-t-il un moyen de déterminer si l'utilisateur se connecte sans statut de session côté serveur?

Répondre

1

Non, c'est impossible.
Ces centres de données ne sont pas isolés les uns des autres mais interconnectés.
Il est distribué mais solide "stockage externe tel que la base de données"

Autorisation inter-domaine est une autre affaire, mais facilement atteint aussi.

Quelle est l'utilisation de toute façon d'une telle information - juste le fait que l'utilisateur s'est connecté, sans aucune option de l'utilisateur, les informations d'identification - quelque chose? Pourquoi sans une base de données sur le serveur?

+0

Voulez-vous dire que Google aura un stockage de session accessible à tous pour tous les centres de données? Le côté serveur vérifie généralement si l'utilisateur est connecté; et décidez s'il faut poursuivre l'action de l'utilisateur ou rediriger vers la page de connexion. Dans la vraie vie, je suppose que les options utilisateur seront également chargées dans la session. –

+0

@Morgan bien il a décidé que l'utilisateur est connecté. Quelle est la prochaine? Que voulez-vous dire par "session"? N'est-ce pas la même base de données mondiale? –

+0

Je suppose que les données de session pour les utilisateurs connectés ont généralement des informations par session (par exemple, l'heure de connexion) et certaines informations fréquemment utilisées (par exemple la préférence de l'utilisateur). Ces informations devraient être accessibles globalement aussi. –

1

Ressources utiles:

  • session_save_handler vous permet de remplacer la gestion des sessions à base de fichiers PHP par vos propres mécanismes, par exemple connexion à une base de données externe

  • this SO question traite de la réplication mySQL.

Ceci est seulement un des nombreux problèmes lors du passage de plusieurs serveurs avec une solution PHP - Je suis sûr qu'il ya plus de trouver sur le sujet dans la recherche de SO.

En outre, envisagez de rechercher une erreur de serveur.

1

En supposant que l'utilisateur est authentifié juste parce que quelque chose qui ressemble à un cookie de session existe est une très mauvaise idée. Votre code deviendra également très en désordre quand vous commencerez à essayer de mesurer des faits au sujet de la session sans appeler d'abord session_start(). Une meilleure solution consiste à stocker le fait que l'utilisateur est authentifié (et potentiellement une partie des informations d'autorisation) dans la session elle-même, par ex.

session_start(); 
if (!$_SESSION['auth_user']) { 
    if ($_POST['username'] && $_POST['password'] 
     && check_valid($_POST['username'],$_POST['password']) { 
      $_SESSION['auth_user']=$_POST['username']; 
     } else { 
      // user is not logged in 
      header('Location: /login.php'); 
      print 'You are not logged in'; 
      exit; 
     } 
} 

C.

0

Alors, est-il un moyen de déterminer si l'utilisateur est connexion sans état de session côté serveur?

Oui, il y a. Le serveur doit définir un cookie avec un ID utilisateur chiffré (et éventuellement d'autres données). Si tous les serveurs partagent la clé, ils savent également comment déchiffrer ce cookie et ainsi authentifier l'utilisateur de manière indépendante. Si le cookie contient également un ID utilisateur non crypté, vous pouvez utiliser une fonction de cryptage unidirectionnel personnalisée (hachage avec salt ou MAC) pour vérifier si elle est valide. Si vous vous souciez vraiment de la sécurité, vous pouvez crypter plus de données, par ex. Adresse IP, date d'expiration, etc. Si vous le souhaitez, vous pouvez également utiliser un cryptage asymétrique, avec des clés publiques et privées, et/ou une signature numérique.

+0

ne serait-ce pas suffisant pour signer le cookie? – alapeno

+0

oui, je l'ai mentionné aussi. – Adam

Questions connexes