Transparente Benutzersitzung über mehrere Standorte (Single Sign-On + Single Sign-Off)

Ich habe mehrere Websites in verschiedenen Domänen:example.com, example.org, mail.example.com undpassport.example.org. Alle Websites haben ein einheitliches Erscheinungsbild und sollten dieselbe Benutzerbasis haben.

Und in solch einem extremen Fall möchte ich immer noch, dass alle Websites dies tuntransparent Teilen Sie (so viel wie möglich) Benutzersitzungen mit den folgenden Schlüsseleigenschaften:

Einmalige Anmeldung. Wenn sich der Benutzer um anmeldetpassport.example.org und besucht jede andere Site - er sollte als eingeloggt behandelt werden.

Angemeldete Benutzer erhalten „Hallo,$usernameBegrüßung in der Kopfzeile der Site und in einem anderen Navigationsmenü, in dem die Dienste aufgelistet sind, auf die sie Zugriff haben. Wenn er nicht angemeldet ist, wird anstelle einer Begrüßung ein Link zum Anmelden angezeigt, der auf verweistpassport.example.org/signon.

Die Liste der vertrauenswürdigen Domänen ist bekannt, so dass dies entweder mit OpenID oder mit einem homebrewn Lightweight-Protokoll relativ einfach zu implementieren ist. Wenn der Benutzer die Site zum ersten Mal besucht, leite ich ihn zum speziellen Authentifizierungsendpunkt umpassport.example.org, der ihn dann stillschweigend zurückleitet, einschließlich der Identitätsinformationen (oder der nicht angemeldeten anonymen Identität). Für die meisten Browser ist dies völlig transparent. Offensichtlich verwende ich Nonce-Werte, um Umleitungsschleifen zu bekämpfen.

Einmaliges Abmelden. Wenn der Benutzer beim nächsten Besuch einer Site in der Kopfzeile einer Site auf "Abmelden" klickt, sollte dies als "Nicht angemeldet" angesehen werden.

OpenID wurde dafür nicht entwickelt. Meine aktuelle Idee (ich habe bereits eine teilweise funktionierende Implementierung) ist es, keine Benutzeridentität, sondern ein "globales" Sitzungstoken zu senden und eine globale Sitzungstabelle (global_session_token ↔ Benutzerbeziehung) in der Datenbank freizugeben.

Unterstützung für Roboter und Benutzer ohne Cookies. Websites haben öffentliche Bereiche, auf die Benutzeragenten ohne Cookie-Unterstützung zugreifen können sollten.

Aus diesem Grund wird die in (1) erwähnte Umleitung zu einem Problem, da ich bei jeder einzelnen Seitenanforderung den Benutzeragenten dazu bringe, den Endpunkt und zurück zu autorisieren. Dies wird nicht nur Roboter verwirren, sondern auch meine Sitzungsdatenbank sehr schnell mit Sitzungen verunreinigen, die bei der Geburt gestorben sind. Und ich möchte definitiv nicht die Seite „Hey, du hast keine Cookies aktiviert, geh weg!“ Anzeigen, das wäre extrem unhöflich und enttäuschend. Während ich für die Anmeldung Cookie-Unterstützung benötige, möchte ich, dass Benutzer frei lesen können, wozu die Websites dienen usw. - ohne Einschränkungen.

Und ich ausdrücklichnicht Ich möchte Sitzungs-IDs in URLs einfügen, mit Ausnahme einiger transparenter domänenübergreifender Umleitungen, die ich erwähnt habe. Ich glaube, dies ist ein Sicherheitsproblem und im Allgemeinen eine schlechte Sache.

Und hier habe ich fast keine Ideen mehr.

Okay, ich weiß, das ist schwer, aber Google macht das eigentlich irgendwie mit (google.com, google.Viele gTLDs, gmail.com und so weiter), richtig? Das sollte also möglich sein.

Ich wäre dankbar, wenn entweder Ideen zur Protokollbeschreibung (das wäre das Beste) oder Links zu Systemen (entweder Code zum Lesen oder nur Live-Sites zum Ansehen und Erlernen) bereits so etwas erfolgreich implementiert hätten.

Etwas zusammenfassen: Mehrere Domains ohne gemeinsamen Stamm, gemeinsame Benutzerbasis, einmaliges Anmelden, einmaliges Abmelden, keine Cookies erforderlich, um anonym zu surfen.

Alle Sites befinden sich im selben Netzwerk (sie befinden sich jedoch auf unterschiedlichen Servern) und verwenden teilweise dieselbe PostgreSQL-Datenbank (sie befinden sich in unterschiedlichen Schemata derselben Datenbank). Die meisten Sites sind mit Python / Django geschrieben, aber einige verwenden PHP und Ruby on Rails. Während ich über etwas Framework- und Sprachunabhängiges nachdenke, bin ich dankbar, dass ich auf Implementierungen hingewiesen habe. Selbst wenn ich sie nicht verwenden kann, kann ich vielleicht etwas Ähnliches implementieren, wenn ich die Idee habe, wie es dort gemacht wird.

Antworten auf die Frage(7)

Ihre Antwort auf die Frage