[PHP] Cross-domain uitloggen

Pagina: 1
Acties:
  • 126 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Hoi hoi :)

Zoals jullie misschien wel weten (die paar lezers van m'n blog :p) ben ik bezig met een cross-site inlogsysteem, wat nu op zich wel goed werkt. Bij inloggen hoort ook uitloggen, en daar heb ik een klein probleempje nu...

Als je site A bezoekt en inlogt, en daarna doorgaat naar site B en op iets klikt waarvoor je rechten moet hebben, word je doorverwezen naar de inlogserver die je daarna automatisch inlogt op B. Omdat de sites fysiek gescheiden (kunnen) zijn, is het aanspreken van een centrale database niet mogelijk, ik werk daarom met tokens die via een hidden form naar de website worden verzonden. (Een beetje zoals Live ID het doet)

Goed, inloggen werkt dus goed (al moet m'n code netter, maar dat komt nog)... nu het uitloggen nog. Het is de bedoeling dat een klik op [Log uit] op een website die mijn systeem gebruikt meteen op alle sites uitlogt. Omdat het niet efficiënt is om tegen 101 sites te zeggen "log mij uit zelfs al ben ik niet ingelogd" ga ik een lijstje bijhouden (sessie/cookie) van sites waarop de gebruiker is ingelogd, daarna hoeft alleen voor die sites de uitlogpagina te worden aangeroepen.

Ik wil graag een overzichtspagina kunnen maken, die met vinkjes danwel kruisjes aangeeft of het uitloggen is gelukt of niet. Ik heb een werkend voorbeeld, maar dit werkt op basis van Javascript. Er wordt - dynamisch - een <script> aangemaakt met een src van de uitlogpagina (http://site/auth.php?action=jslogout), die retourneert danwel "taskCompleted();" danwel "taskFailed();", waarna het script (het uitloggen gebeurt als een takenlijst - één voor één wordt de gebruiker uitgelogd).

Dit vind ik echter geen nette oplossing, een site kan immers de auth.php aanpassen en er vervolgens kwaadwillende code inzetten... hetgeen niet wenselijk is. Ik wil niet dat mensen worden gehacked via mijn uitlogpagina... dit moet dus anders. XMLHttpRequest zou ideaal zijn... als dat geen cross-domain-beperkingen zou kennen...

Maar hoe? Als ik kijk hoe Microsoft het oplost (met hun "Windows Live ID web authentication"-gedoe) is het relatief simpel... als het uitloggen gelukt is wordt er een null-gifje verstuurd naar de gebruiker en toont Live ID een vinkje, als het uitloggen mislukt wordt er niks verzonden en wordt er een kruisje getoond... maar hoe krijg ik dat voor elkaar op mijn eigen systeem... hoe bepaal ik welk plaatje (kruisje/vinkje) getoond moet worden? Ik kan de site zelf die plaatjes laten verzenden, maar dan kan er een goatse of tubgirl tussenkomen en dat wil ik ook niet.

Heeft iemand hier misschien een beter/ander idee om dat uitloggen aan te pakken?

We are shaping the future


Acties:
  • 0 Henk 'm!

  • Cartman!
  • Registratie: April 2000
  • Niet online
Hoe heb je het crossdomain inloggen gemaakt dan, of vermeld even t topic waarin het systeem staat. Het lijkt me dat je 1 database hebt namelijk met sessies. Als je de sessie van die user verwijdert die actief is op de domeinen dan zou je toch nergens meer ingelogd zijn?

Acties:
  • 0 Henk 'm!

  • Comgenie
  • Registratie: Oktober 2005
  • Laatst online: 12-09 13:09

Comgenie

Soms heb je dat

zorg dat de 'javascript' part serverside word. Dat er gewoon een scriptje de uitlog pagina's bezoekt van de site's die mee werken. Zodat die site's de ingelogde gebruikers-sessies verwijderd. Gewoon een uitlogwannabeplaatje.php laden in <img> is natuurlijk wat eenvoudiger om meteen cookies te verwijderen.

No animals were harmed in the making of this comment.


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Gebruik het plaatjes idee, maar dan met een script op de inlogserver:
HTML:
1
2
3
<img src="inlogserver/loguit.php?site=site1">
<img src="inlogserver/loguit.php?site=site2">
<img src="inlogserver/loguit.php?site=site3">

Dan kun je in loguit.php een pagina op de site aanroepen en besluiten of je een kruisje of vinkje wil tonen. Als bonus gaat het nu ook nog eens allemaal tegelijk (nou ja, max 3 of 5 oid, afhankelijk van je browser).

PS. Maak je het wel OpenID compatible?

[ Voor 4% gewijzigd door Gerco op 26-07-2007 23:42 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Gerco schreef op donderdag 26 juli 2007 @ 23:41:
PS. Maak je het wel OpenID compatible?
Daar wilde ik ook graag iets over opmerken: waarom heb je een eigen Single Sign-On systeem nodig als er al OpenID bestaat?

Rustacean


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Cartman! schreef op donderdag 26 juli 2007 @ 23:38:
Hoe heb je het crossdomain inloggen gemaakt dan, of vermeld even t topic waarin het systeem staat. Het lijkt me dat je 1 database hebt namelijk met sessies. Als je de sessie van die user verwijdert die actief is op de domeinen dan zou je toch nergens meer ingelogd zijn?
Zoals ik al eerder zei... het systeem werkt tokenbased en niet-centraal. De sites ontvangen een token (encrypted) wat ze decrypten en valideren... als alles goed gedecodeerd wordt heeft de site wat info over de user (voornamelijk userid en timestamp), en is de gebruiker ingelogd. De site neemt geen contact op met een centrale server, ook om vertragingen enzo te voorkomen...
Gerco schreef op donderdag 26 juli 2007 @ 23:41:
Gebruik het plaatjes idee, maar dan met een script op de inlogserver:
HTML:
1
2
3
<img src="inlogserver/loguit.php?site=site1">
<img src="inlogserver/loguit.php?site=site2">
<img src="inlogserver/loguit.php?site=site3">

Dan kun je in loguit.php een pagina op de site aanroepen en besluiten of je een kruisje of vinkje wil tonen. Als bonus gaat het nu ook nog eens allemaal tegelijk (nou ja, max 3 of 5 oid, afhankelijk van je browser).

PS. Maak je het wel OpenID compatible?
Ik snap je voorbeeld wel, maar hoe script ik dan dat hij op een andere site een actie uitvoert? Als ik gewoon file_get_contents doe ik dat loguit.php-script logt hij de server uit, en niet de bezoeker...


Over OpenID: ja het wordt compatible (wellicht niet vanaf v1.0, maar compatible wordt het wel), waarom ik het zelf niet kies: ten eerste omdat ik al een userbase heb en ten tweede omdat ik het niet echt eens ben met sommige punten van OpenID, bijvoorbeeld de username. Ik wil dingen op e-mailadres gebaseerd hebben...

We are shaping the future


Acties:
  • 0 Henk 'm!

  • disjfa
  • Registratie: April 2001
  • Laatst online: 03-07 14:47

disjfa

be

Als je de token in de db staat. Daar zegt dat deze niet meer bestaat. Dan kan je toch daarnaar kijken of je deze op een ander domein later achter de schermen automatisch uitlogt.

Of denk ik nu heel vreemd.

disjfa - disj·fa (meneer)
disjfa.nl


Acties:
  • 0 Henk 'm!

  • frickY
  • Registratie: Juli 2001
  • Laatst online: 18-09 14:42
@Alex)
Je laat de bezoeker een afbeelding openen, wat eigenlijk jouw uitlog-script is (of deze nu op de zelfde of een andere server staat maakt niet uit)
Dat uitlog-script laat je vervolgens een afbeelding weergeven, een vinkje of kruisje, aan de hand van het wel of nie tkunnen uitloggen.
Briljant van Gerco :) Als je hier niets aan hebt snap ik je opzet qua inloggen/uitloggen niet.

[ Voor 10% gewijzigd door frickY op 27-07-2007 08:05 ]


Acties:
  • 0 Henk 'm!

  • RAJH
  • Registratie: Augustus 2001
  • Niet online
Ik snap je voorbeeld wel, maar hoe script ik dan dat hij op een andere site een actie uitvoert? Als ik gewoon file_get_contents doe ik dat loguit.php-script logt hij de server uit, en niet de bezoeker...
Je kan de plaatjes toch ook naar een andere url laten verwijzen, zoals:

HTML:
1
2
3
<img src="inlogserver1/loguit.php">
<img src="inlogserver2/loguit.php">
<img src="inlogserver3/loguit.php">


Dien je wel de sites bij te houden waarop de gebruiker is ingelogd.

Acties:
  • 0 Henk 'm!

  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

Je zou ook naar de ideeen achter SAML 2 kunnen kijken. Eén van de verbeterpuntjes van SAML 2 t.o.v. SAML (1) is ondersteuning voor uitloggen.

Fat Pizza's pizza, they are big and they are cheezy


Acties:
  • 0 Henk 'm!

  • Gerco
  • Registratie: Mei 2000
  • Laatst online: 10-08 02:59

Gerco

Professional Newbie

Alex) schreef op vrijdag 27 juli 2007 @ 07:52:
Ik snap je voorbeeld wel, maar hoe script ik dan dat hij op een andere site een actie uitvoert? Als ik gewoon file_get_contents doe ik dat loguit.php-script logt hij de server uit, en niet de bezoeker...
Wat je moet doen in inlogserver/loguit.php is de cookie/token van de gebruiker opvragen en dan doormelden aan de site die het uitloggen gaat doen via een GET of POST variable.
Ik wil dingen op e-mailadres gebaseerd hebben...
Ik eigenlijk ook wel, maar juist door URLs te gebruiken worden dingen als delegation mogelijk en kun je zonder (centrale) database werken. Dat is 1 van de kernpunten van OpenID, decentraal opereren. Als dat betekent dat ik mijn e-mail adres niet kan gebruiken als ID, jammer, dat heb ik er wel voor over als ik alle andere voordelen wel kan krijgen. Mijn e-mail adres publiceer ik dan wel op mijn URL :)

Ik zie alleen OpenID nog niet echt van de grond komen, jammer, want ik vind het een geweldig concept.
frickY schreef op vrijdag 27 juli 2007 @ 08:05:
@Alex)
Je laat de bezoeker een afbeelding openen, wat eigenlijk jouw uitlog-script is (of deze nu op de zelfde of een andere server staat maakt niet uit)
Ja, dat maakt wel uit als je externe sites van het systeem gebruik laat maken. Zoals Alex) zegt, kan zo'n site best een goatse of 1 of andere exploit opsturen als plaatje en dan sla je natuurlijk een modderfiguur.

Dat plaatje komt van je centrale server die daarvoor de site gaat aanroepen om userx uit te loggen. Je moet er dan wel voor zorgen dat alleen de server dat kan doen, beetje met asymmetrische encryptie spelen dan maar, een andere oplossing zou ik daarvoor niet zo snel weten.

[ Voor 26% gewijzigd door Gerco op 27-07-2007 09:14 ]

- "Als ik zou willen dat je het begreep, legde ik het wel beter uit!" | All number systems are base 10!


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Een betere optie gewoon een simpele webservice. Deze beheert je login database. Als iemand op een site wilt inloggen dan controleert de webservice de username/password combinatie. Als deze correct is zet de webservice een flaggetje in de database. Ik neem aan dat je met sessies werkt en alleen de login status van de gebruiker controleert bij de start van de sessie. Bij de start van de sessie vraag je bij de webservice de status van de gebruiker op.

Op deze manier log je een gebruiker niet op elke website uit. Pas als hij op de betreffende website komt (en een sessie start) wordt zijn status gecontroleerd.

Dit is de manier waarop de meeste websites multisite logins hebben geimplementeert. Deze methode wordt in elk geval aangehouden bij kruidvat en heineken.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • djc
  • Registratie: December 2001
  • Laatst online: 08-09 23:18

djc

Gerco schreef op vrijdag 27 juli 2007 @ 09:10:
Ik zie alleen OpenID nog niet echt van de grond komen, jammer, want ik vind het een geweldig concept.
Volgens mij bestaat er wel genoeg tractie, het moet alleen nog een beetje meer doorbreken naar de mainstream. AOL ondersteunt het al, Microsoft gaat het ondersteunen...

Rustacean


Acties:
  • 0 Henk 'm!

  • Alex)
  • Registratie: Juni 2003
  • Laatst online: 21-08 11:20
Microsoft heeft inderdaad aangegeven dat ze naar OpenID gaan kijken... ze zijn er in ieder geval in geïntereseerd ja...


Ik heb net maar eens gekeken hoe Microsoft het zelf doet... en dat is opzich best slim gedaan... ze hebben een hidden image (0x0 pixels) die het daadwerkelijke uitloggen doet, en daaraan hebben ze een onload en een onerror gehangen... als het uitloggen goed gaat retourneert een site een null-gifje van 1x1 pixels, en dan wordt onload getriggerd en het licht op groen gezet. Bij een error op de site wordt ook een fout gifje geretourneerd en dus onerror getriggerd. En dan een rood kruisje :)

Best simpel eigenlijk, alleen zit die uitlogpagina wel heel slordig in elkaar... (veel <iframe>s puur voor de branding enzo...)

We are shaping the future

Pagina: 1