instant-thinking.de

just enough to get you started and leave you confused

OpenID selber hosten

| Kommentare

OpenID1 ist ein dezentrales Single SignOn Verfahren das helfen will, die Legion der User/Passwort-Kombinationen zu reduzieren.

Die Idee ist, dass man sich einmal eine OpenID besorgt und sich dann mit dieser bei vielen Sites anmelden kann. Dazu wird meistens ein OpenID-Feld angezeigt in dem man dann die Adresse seiner OpenID einträgt. Die Login-Seite leitet dann zu der OpenID weiter. Sollte man sich im Verlauf der aktuellen Surf-Session noch nicht mit seiner OpenID angemeldet haben macht man das nun, wird wieder zurück auf die Seite geleitet an der man sich anmelden wollte und ist drin. Das ganze sieht dann z. B. so wie bei identi.ca2 aus:

openid_login_identica

Das ist sehr einfach und hört sich nur anfangs kompliziert an.

Das ganze hat aber auch Haken:

  • Bei weitem nicht alle Websites des Internet unterstützen OpenID[^fn2]
  • Manche Websites geben zwar OpenIDs aus, nehmen aber keine fremden an, so dass der ganze dezentrale Gedanke den Sinn verliert
  • Man vertraut seine Login-Daten für eine ganze Menge Sites seinem OpenID-Provider an

Das letzte Problem lässt sich schnell lösen, wenn man einfach sein eigener OpenID-Provider wird.

Dazu braucht man im Prinzip nur ein bisschen eigenen Webspace der PHP kann und das Script PHPMyID. Da ich Wordpress für meine Seite benutze, habe ich ausserdem noch das OpenID Delegate PlugIn heruntergeladen, das es sehr einfach macht OpenID-Anfragen an die richtige Stelle zu lenken.

Weiter nach dem Klick… Und schon gehts los:

Ich habe auf meinem Webspace einen neuen Ordner namens id erstellt und die beiden3 Dateien aus denen PHPMyID besteht in diesen Ordner hoch geladen.

Die Datei MyID.config.php habe ich in index.php umbenannt, die Datei MyID.php habe ich gelassen wie sie ist.

Jetzt kann man schon mal die Erreichbarkeit testen. Wenn man seine OpenID aufruft4 sollte man als Meldung “This is an OpenID Server endpoint.” zurück bekommen. Ausserdem sollte die Meldung eine “Server”-URL und eine “Realm” enthalten. Diese sollte in den meisten Fällen “phpMID” lauten. Wenn zum Beispiel eine Zahl an diesem String dran hängt, läuft PHP im Safe Mode. Das ist nicht schlimm, dann muss man sich den Realm-Wert nur merken.

In der index.php Datei werden nun der eigentlich User und das Passwort eingetragen. Damit das Passwort nicht im Klartext im Internet steht wird es vorher lokal md5-verschlüsselt.

Das geht unter unixoiden Systemen so:

$ echo -n 'username:realm:password' | openssl md5

Windows-User können sich hier eine md5.exe herunterladen und dann z.B. so ein verschlüsseltes OpenID-Passwort herstellen:

C:\Dokumente und Einstellungen\user\Desktop>md5.exe -d"username:realm:password"

Username, Passwort und die Realm muss man natürlich durch die eigenen Werte ersetzen. Das so entstandene Passwort und den Usernamen fügt man nun in die index.php ein, das sollte dann ungefähr so ausschauen:

1
2
'auth_username' =>      'username',
'auth_password' =>      'ce7ay7i939a4aae768359ac0547wc5be',

Jetzt kann man sich unter dem schon vorhin getesteten OpenID-Endpoint anmelden indem man auf “Login” klickt.

An dieser Stelle wurde bei mir leider ein Fehler ausgegeben: Missing expected authorization header.

Das bedeutet, dass PHP im CGI-Modus läuft und daher die http request header nicht von phpMyID lesbar sind. Glücklicherweise liefert phpMyID aber eine Datei namens htaccess mit. Diese habe ich ebenfalls in mein id-Verzeichnis hochgeladen und in .htaccess umbenannt. Der Inhalt sieht bei mir aus wie folgt, vielleicht muss man aber auch eine der anderen beiden mitgelieferten Möglichkeiten ausprobieren, YMMV:

1
2
3
4
5
6
RewriteEngine on
RewriteCond %{HTTP:Authorization} !^$
RewriteCond %{QUERY_STRING} openid.mode=authorize
RewriteCond %{QUERY_STRING} !auth=
RewriteCond %{REQUEST_METHOD} =GET
RewriteRule (.*) %{REQUEST_URI}?%{QUERY_STRING}&auth=%{HTTP:Authorization} [L]

Durch diese mod_rewrite Magie werden die request header passend umgeformt.

Wenn das nun klappt muss man nur noch anderen Websites sagen, wo sich die OpenID verbirgt. Dazu muss man im Header der Site folgende Angaben machen5:


In Wordpress kann man das einfach mit dem oben erwähnten Plugin bewerkstelligen, das ist noch etwas einfacher und schaut in der Konfiguration dann so aus:

OpenID Delegation plugin

Und das wars dann auch. Jetzt kann ich die Adresse meiner Website benutzen um mich bei verschiedenen Websites anzumelden.

Wer sich lieber keine Umstände mit der Erstellung und dem Hosting einer OpenID machen möchte, kann das OpenID Delegation Plugin auch nutzen, um die eigene OpenID bei einem Provider6 hosten zu lassen und trotzdem die URL der eigenen Website verwenden. In dem Fall werden dann die OpenID-Anfragen eben einfach an username.myopenid.com weitergeleitet.

Wie man es sich letzen Endes im OpenID-Land einrichtet ist ja eigentlich auch gar nicht so wichtig, die verschiedenen Möglichkeiten werden durch die Offenheit des Protokolls alle gleichberechtigt behandelt. Viele weitere Möglichkeiten sind in dem hervorragendem Post OpenID for non-SuperUsers von Sam Ruby aufgeführt. Besonders die Variante mit YADIS finde ich sehr interessant…

In Zukunft werden sicherlich noch mehr Websites mit OpenID-Unterstützung auftauchen und die Nützlichkeit einer solchen Authentifizierung im gleichen Masse steigen. Bleibt zu hoffen, dass sich weitere große und kleine Anbieter an dieser Idee beteiligen.

(via: interwingly.net und Dr. Nic)

  1. Hier der sehr erhellende Wikipedia-Eintrag

  2. Ein Twitter-Clone

  3. In Worten: Zwei!

  4. hier also http://instant-thinking.de/id, für eigene Installationen muss die URL natürlich angepasst werden

  5. Natürlich wieder durch eigene Werte ersetzen

  6. z.B. MyOpenID.com die sind ziemlich toll

Comments