9
votes

Authentification PHP avec plusieurs domaines et sous-domaines

J'ai un domaine principal: main.com , sous-domaines: test1.main.com , test2.main.com et d'autres domaines one.com , deux.com .

C'est fait comme suit: xxx

login.php < / p> xxx

ajouté sur chaque page: xxx

logout.php xxx < p> Mais cela ne fonctionne que sur le domaine main.com et ses sous-domains test1.main.com , test2.main.com .

J'ai besoin de sauvegarder la session et sur d'autres domaines one.com , deux.com .

Comment faire de l'authentification saine , s'il y a des solutions, je me suis vraiment confondu, veuillez dire avec exemple.


5 commentaires

Nous avons besoin Way Plus de détails sur ce que vous essayez d'accomplir. Qu'est-ce que l'authentification a à voir avec les différents domaines? Veuillez modifier votre question pour ajouter plus de détails.


Dupliquer de Stackoverflow.com/Questtions/244008/...


Whoa! Ne stockez jamais les mots de passe dans un cookie, ni la table DB. Les mots de passe doivent être stockés hachés par la bibliothèque PHPASS.


J'ai déjà corrigé le problème dans un autre


Ajax / js et solution iframe proposée ici: Stackoverflow.com/q/4813498/1066234 Vérifiez également cet exemple ici: github.com/0k/multidomain-sso


3 Réponses :


2
votes

Pour conserver vos sessions sur plusieurs domaines, vous devez utiliser session_set_cookie_params () . Avec cela, vous pouvez spécifier votre domaine. Par exemple ... xxx

qui définira le délai de session à 10 000 secondes pour tous les documents sous la racine du site et pour tous les sous-domaines de Main.com.

vous devrait appeler session_set_cookie_params () avant de faire session_start () .


2 commentaires

Je l'ai fait trop ini_set ("session.cookie_domaine", ".main.com"); Mais problème dans d'autres domaines (one.com, deux.com) non sous-domaines.


Ah, je vois. Eh bien, pour cela, vous allez devoir passer manuellement l'ID de session et stocker probablement cette information de session quelque part. Vous ne pouvez pas avoir de cookies créé sur un domaine et lire par un autre.



11
votes

Autant que je sache, la traversée des sessions entre les sous-domaines va bien, mais elle ne portera pas sur un tout nouveau domaine. Pour ce faire, vous avez besoin d'une sorte de méthode de données centralisée, ou d'une API.

Méthode de base de données: Vous devrez créer un accès de données MySQL distant afin que Domain2.com puisse accéder à la base de données sur domaine1.com. Lorsqu'un identifiant est effectué, il ne devrait pas seulement créer une nouvelle session, mais un jeton de connexion unique (avec une heure d'expiration) doit être placé dans la base de données MySQL. Maintenant, pour chaque lien qui va de domaine1.com à domain2.com, vous devez ajouter une variable $ _GET contenant un ID de session généré aléatoirement (le hachage de MD5 fera). Domain2.com, à la réception du visiteur, prendra la variable $ _GET, exécutez-la via la base de données MySQL pour rechercher le jeton de connexion et s'il existe une correspondance, considérons que l'utilisateur doit être connecté (et peut-être incorporer un $ _Cookie comme bien stocker les données de connexion). Cela rendra la transmission transférée entre deux domaines complètement différents.

Méthode API : Vous devez créer une méthode API, de sorte que Domain1.com puisse répondre à une demande externe des domaines autorisés pour récupérer le jeton de connexion sur un utilisateur en cours de transmission. Cette méthode nécessitera également que toutes les liens passent de domain1.com sur Domain2.com doivent être annexées avec une variable $ _GET pour réussir la session unique Hash. Ensuite, lors de la réception du visiteur, Domain2.com fera une demande de curl () à domain1.com/userapi.php (ou tout ce que vous appelez le fichier) et les variables doivent être testées contre ce qui est dans la base de données.

C'est le meilleur que je puisse l'expliquer .. Pour écrire cela dans le code est un travail important pour que je ne puisse pas vous engager. Mais en juger par votre code, vous avez une très bonne compréhension de PHP, donc je suis convaincu que vous allez retirer cela!

Bonne chance mate.


15 commentaires

Sweet ... commentez ici si vous avez d'autres questions, je souhaiterais que cela fonctionne également. Autant que je sache, l'authentification Facebook sur les sites Web tiers (domaines totalement différents) utilise une méthodologie similaire de jeton d'API.


D'accord, mais avec recommandation que OP trouve une solution existante plutôt que de rouler le sien. "Mon premier système de sécurité est notoirement vulnérable à l'attaque.


S'il vous plaît, parlez-moi des solutions existantes


Vraiment peut t comprendre comment recevoir mon sesside ou mon cookie ou quelque chose du domaine principal. J'ai essayé d'envoyer Sessid sur la connexion avec IMG à tous les domaines, mais j'ai tellement de domaines, je peux t comprendre


Jusqu'à présent, je ne suis pas au courant des solutions existantes .. J'ai tendance à faire du codage PHP lourd, à partir de zéro. Je déteste Joomla / Drupal, etc. Pour la sécurité, utilisez simplement votre sens commun - Empêchez les injections SQL à l'aide de la fonction mysql_real_escape_string (), assurez-vous que les jetons de la DB expirent automatiquement toutes les 10 minutes ou donc à moins que l'utilisateur est actif, auquel cas Sur chaque charge de page, renouvelez le jeton pendant 10 minutes supplémentaires à partir de l'état actif actuel. Assurez-vous que les jetons ne sont pas envoyés à aucun e-mails, etc. et peut-être réaffecter le hachage de jeton sur chaque saut de site à un autre. Et n'oubliez pas la commande MD5 ()!


Je déteste trop joomla et d'autres, car mysql utilise ma petite classe, si je trouve une solution, je mette à jour ce poste, merci pour des pensées


OK Quand une session est créée sur la première connexion (disons, sur one.com) Entrez une ligne MySQL dans la table des jetons qui contient une session unique ID THA Tlooks comme ceci: FG4D56F4DS98F4DASF ... MD5 () créera cela. Ensuite, vous avez une ligne de base de données contenant l'identifiant unique de l'utilisateur, le jeton de connexion et une heure d'expiration. Ensuite, créez un fichier .php sous one.php qui répondra soit à 1 ou 0 selon qu'il existe une connexion valide pour un utilisateur de certains utilisateurs (par exemple, ma ligne d'utilisateur se trouve être la ligne 4324, alors requête pour id = 4324 et hachage = 'fg4d56f4ds98f4dasf') ...


puis utilisez la fonction CURL de Two.com pour vérifier contre cette valeur. Si la réponse est 1, ce qui signifie positif, le login doit être transféré .. Créer instantanément une session sur deux.com indiquant une connexion réussie, avec le numéro de hachage pris. Pour la sécurité, le fichier .php sur one.com que vérifie la connexion ne doit donner que la valeur si le domaine d'origine est l'un des domaines vérifiés.


Vous voulez dire que nous n'avons pas besoin de sesssid et de cookies de transfert, mais seulement 1 ou 0 et si 1 et 1 que créer une nouvelle session sur le domaine secondaire avec «OK, il est connecté» dans HASH. Et sur le domaine principal, utilisez l'authentification avec la vérification des jetons de cookies avec un jeton DB. Je peux T pense aujourd'hui, demain va essayer, merci


Peut-être que quelque chose que je n'ai pas compris correctement, des plesae, donne un exemple de code


Ok disons quand je me connecte, une rangée de jeton est créée dans la table des jetons .. Identifiant: 4324, jeton: FG4D56F4DS98F4DASF, exp: 2010-11-03 14:00:00 alors s'il y a des liens qui vont à Deux.com, il devrait être annexé avec? hash = fg4d56f4ds98f4dasf. Ensuite, lors de la réception de ce lien, sur le côté de Two.com, le code PHP traite qu'un $ _GET ['hachage'] var a été donné .. Ainsi, la fonction CURL, vérifie le login (tout cela se produit avant toute sortie de l'écran!) Redirige l'utilisateur à la page sans le? hachage = fg4d56f4ds98f4dasf .. Parce que l'écran de navigateur restant de navigateur sera un problème de sécurité.


Utilisation de CURL, vous pouvez envoyer un message et obtenir des vars. Alors alors vous enverriez le hasch de deux.com à one.com, et le fichier .php sur one.com fait une requête de base de données. "Sélectionnez * à partir de jetons où userid = '4324' et hachage = 'fg4d56f4ds98f4dasf' et exp <'$ $ courante' "Oh N'oubliez pas d'inclure l'UID dans le lien aussi, pas seulement le hachage:? hash = fg4d56f4ds98f4dasf & uid = 4324


Maintenant, je comprends, ça marche. Mais comment Tumblr.com le faites-le sans jetons dans des liens sur les domaines?


Mais si si l'utilisateur va directement sans jeton dans obtenir?


Hmmm je ne suis pas sûr à 100% de la façon dont la gobelet le fait .. Je devrais le voir. Je sais que l'authentification FB est faite à travers leur API de connexion. Pourrait être une méthode iframe aussi? Cela vaut la peine de rechercher ou de creuser à coup sûr. J'aimerais essayer de faire une interface de connexion plus fluide!



2
votes

Mais si l'utilisateur rejoignez les domaines One.com directement, One.com ne peut pas savoir si l'utilisateur était connecté par la bonne réponse mentionnée ci-dessus, semble que cela doit utiliser des JSJ, c'est JSONP! Nous laissons compte.main.com/userloginstat.php?callback=loginthisdomain Pour vérifier si l'utilisateur avait connecté Main.com, le cas échéant, la fonction de rappel JS loginThisdomain faisait quelque chose à l'utilisateur d'Autologin à One.com.


0 commentaires