43 votes

Quelle est votre méthode préférée de partage des cookies entre domaines ?

Je vois que l'astuce iframe/p3p est la plus populaire, mais personnellement je ne l'aime pas parce que javascript + champs cachés + frame donnent vraiment l'impression d'un travail de bidouilleur. J'ai également rencontré une approche maître-esclave utilisant un service web pour communiquer ( http://www.15seconds.com/issue/971108.htm ) et il semble meilleur parce qu'il est transparent pour l'utilisateur et qu'il est robuste face aux différents navigateurs.

Existe-t-il de meilleures approches, et quels sont les avantages et les inconvénients de chacune ?

60voto

thomasrutter Points 42905

Mon approche désigne un domaine comme domaine "central" et tous les autres comme domaines "satellites".

Lorsqu'une personne clique sur un lien de connexion (ou présente un cookie de connexion persistant), le formulaire de connexion envoie finalement ses données à une URL située sur le domaine central, ainsi qu'un élément de formulaire caché indiquant de quel domaine elles proviennent (par commodité, pour que l'utilisateur soit redirigé ensuite).

Cette page du domaine central définit ensuite un cookie de session (si la connexion s'est bien déroulée) et redirige vers le domaine à partir duquel l'utilisateur s'est connecté, avec un jeton spécialement généré dans l'URL qui est unique pour cette session.

La page de l'URL satellite vérifie alors ce jeton pour voir s'il correspond à un jeton qui a été généré pour une session, et si c'est le cas, elle se redirige vers elle-même sans le jeton, et définit un cookie local. Maintenant, ce domaine satellite possède également un cookie de session. Cette redirection efface le jeton de l'URL, de sorte qu'il est peu probable que l'utilisateur ou un crawler enregistre l'URL contenant ce jeton (bien que si c'était le cas, cela ne devrait pas avoir d'importance, le jeton peut être à usage unique).

Maintenant, l'utilisateur a un cookie de session à la fois dans le domaine central et dans le domaine satellite. Mais que se passe-t-il s'il visite un autre satellite ? Eh bien, normalement, il apparaît au satellite comme non authentifié.

Cependant, dans toute mon application, chaque fois qu'un utilisateur a une session valide, tous les liens vers les pages des autres domaines satellites sont accompagnés d'un ?s ou d'un &s. Je réserve cette chaîne de requête 's' pour signifier "vérifiez avec le serveur central car nous pensons que cet utilisateur a une session". Je réserve cette chaîne de requête 's' pour signifier "vérifier avec le serveur central car nous pensons que cet utilisateur a une session". En d'autres termes, aucun jeton ou identifiant de session n'est affiché sur les pages HTML, seule la lettre "s" ne permet pas d'identifier quelqu'un.

Une URL recevant une telle balise de requête 's' va, s'il n'y a pas encore de session valide, faire une redirection vers le domaine central en disant "pouvez-vous me dire qui c'est ?" en mettant quelque chose dans la chaîne de requête.

Lorsque l'utilisateur arrive au serveur central, s'il y est authentifié, le serveur central recevra simplement son cookie de session. Il renverra ensuite l'utilisateur au satellite avec un autre jeton à usage unique, que le satellite traitera comme un satellite le ferait après s'être connecté (voir ci-dessus). En d'autres termes, le satellite créera un cookie de session sur ce domaine et se redirigera vers lui-même pour supprimer le jeton de la chaîne d'interrogation.

Ma solution fonctionne sans script, ni support iframe. Elle nécessite l'ajout de " ?s " à toutes les URL inter-domaines où l'utilisateur n'a peut-être pas encore de cookie. J'ai pensé à un moyen de contourner ce problème : lorsque l'utilisateur se connecte pour la première fois, mettre en place une chaîne de redirections autour de chaque domaine, en plaçant un cookie de session à chaque fois. La seule raison pour laquelle je n'ai pas implémenté cette solution est qu'elle serait compliquée dans la mesure où il faudrait pouvoir définir l'ordre dans lequel ces redirections se produiraient et le moment où elles s'arrêteraient, et qu'elle vous empêcherait de vous étendre au-delà de 15 domaines environ (trop et vous vous rapprochez dangereusement de la "limite de redirection" de nombreux navigateurs et proxies).

2voto

Luca Matteis Points 19338

C'est une bonne solution si vous avez le contrôle total de l'arrière-plan de tous les domaines. Dans ma situation, je n'ai que le contrôle du client (javascript/html) sur un domaine, et le contrôle total sur un autre, donc je dois utiliser la méthode iframe/p3p, ce qui craint :(.

1voto

Tom Lianza Points 1802

L'exemple donné dans cet article me semble suspect, car il s'agit essentiellement d'une redirection vers une URL qui, à son tour, renvoie des variables à votre domaine dans une chaîne de recherche.

Dans l'exemple, cela signifierait qu'un utilisateur malveillant pourrait simplement se rendre à l'adresse suivante http://slave.com/return.asp?Return=blah&UID=123 "et être connecté sur slave.com en tant qu'utilisateur 123.

Est-ce que j'ai raté quelque chose, ou est-ce que l'on sait que cette technique n'est pas sûre et ne devrait pas être utilisée pour, eh bien, des choses comme celles suggérées dans l'exemple (faire circuler les identifiants d'utilisateurs, vraisemblablement pour rendre l'identité d'une personne portable).

1voto

itsallkizza Points 26

@thomasrutter

Vous pourriez éviter de devoir gérer tous les liens sortants sur les satellites (en ajoutant "s" à la chaîne de recherche) en effectuant un appel ajax pour vérifier le statut d'authentification du domaine "central" au chargement de la page. Vous pourriez éviter les appels redondants (lors des chargements de page suivants) en n'en faisant qu'un seul par session.

Il serait sans doute préférable d'effectuer la demande de vérification de l'authentification côté serveur avant le chargement de la page afin (a) d'avoir un accès plus efficace à la session et (b) de savoir, au moment du rendu de la page, si l'utilisateur est connecté ou non (et d'afficher le contenu en conséquence).

0voto

mjy Points 1768

Nous utilisons le chaînage de cookies, mais ce n'est pas une bonne solution puisqu'elle s'arrête lorsque l'un des domaines ne fonctionne pas pour l'utilisateur (en raison du filtrage / des pare-feu, etc.). Les techniques plus récentes (y compris la vôtre) ne s'arrêtent que lorsque le serveur "maître" qui distribue les cookies / gère les connexions s'arrête.

Notez que votre return.asp peut être détourné pour rediriger vers n'importe quel site (cf. ce par exemple).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X