web-dev-qa-db-fra.com

Cookies inter-domaines

J'ai un petit problème.

Comment définir un cookie pour plusieurs domaines?

Je comprends les problèmes de sécurité et je suis sûr que cela a déjà été fait. La raison en est SSO.

c'est à dire.

account.domain.com devra définir un domaine connecté pour:

domain.com, domain1.com, domain2.com.

Existe-t-il un moyen simple d'utiliser PHP et les cookies, ou toute autre alternative?

25
bear

Il n'y a absolument aucun moyen pour domain.com de définir un cookie pour domain1.com. Ce que vous essayez de faire ne peut être résolu qu'en obligeant le navigateur de l'utilisateur à soumettre des demandes à chaque domaine qui créera ensuite son propre cookie.

Ensuite, vous avez besoin d'un moyen pour chaque domaine de vérifier l'identité de l'utilisateur. Il existe deux approches:

  1. Canal arrière - les sites se contactent directement pour déterminer si un utilisateur est connecté.
  2. Passer un jeton dans le GET ou POST - lorsque le navigateur de l'utilisateur est redirigé vers l'autre site, un paramètre signé numériquement est transmis contenant l'identité et l'état de la session.

C'est vraiment assez compliqué. Je vous suggère de ne pas rouler le vôtre. Jetez un oeil à SimpleSAMLPHP pour une implémentation PHP de ce que je décris).

31
Andrew Strong

Cela peut être fait via un domaine agissant comme un maître et d'autres comme un esclave.

Disons que nous avons un domaine accounts.domain.com et que c'est notre maître.

Ensuite, nous avons nos esclaves domain.com, something.com et another.com

Lorsque vous vous connecterez sur domain.com, ce sera en fait le site accounts.domain.com, vous obtiendrez un cookie avec un identifiant unique pour votre navigateur, puis vous serez redirigé vers la page de destination post-connexion de domain.com (par exemple, domain.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>). la page de destination contactera le accounts.domain.com, en l'interrogeant avec l'ID du navigateur. Si la transaction est correcte, vous obtiendrez un cookie de connexion de domain.com.

Ensuite, sur chaque domaine (domain.com, something.com et another.com) sera la redirection initiale vers accounts.domain.com/roaming-check?return-url=<URL the redirect was initiated from>. Parce que nous rentrons chez nous (nous sommes déjà connectés sur accounts.domain.com), nous serons à nouveau redirigés sur notre page de destination (<domain name>.com/logon?check=true&unique-id=<browser unique id>&request-id=<unique request ID>) et à partir de ce moment, c'est la même chose que la partie avec la connexion. Nous sommes parfaitement itinérants vers un autre domaine (sans que l'utilisateur ne le sache car les navigateurs ne montrent généralement pas la page redirigée jusqu'à ce qu'elle passe la section envoyer (serveur)/recevoir (navigateur) des en-têtes).

Dans le cas où il n'y a en fait aucune connexion active, le site enregistrera cette "connexion négative" dans la session et n'essaiera plus de vérifier la connexion (jusqu'à ce que nous essayions de nous connecter ou de charger un autre domaine).

6
lmojzis

Ce que vous essayez ne peut pas être fait. (C'est un problème de sécurité du navigateur, pas un PHP one.)

Outre l'utilisation d'une certaine forme d'authentification hors site, le plus proche possible est de rendre un cookie accessible à travers les sous-domaines, auquel cas vous utilisez simplement l'argument `` domaine '' facultatif de la fonction set_cookie de PHP.

6
John Parker

Je pense que cette solution répondra à vos besoins: " Single Single Sign-On pour PHP "

4
merkuro