Skip to content

Einen eigenen OpenID Server einrichten

Nachdem in letzter Zeit das Login über myOpenId.com recht zäh von statten ging und ich das sowieso noch ausprobieren wollte, habe ich mich mal ran gesetzt und meinen eigenen OpenID Server/Provider aufgesetzt. Was OpenID ist, wozu man es einsetzt und was die Vorzüge sind, habe ich gerade erst beschrieben. Hier geht es also nur noch um das Aufsetzen eines eigenen Servers.

Vorteile eines eigenen Servers

Ein eigener Server ist vor allem eines: Unabhängig von externen Services, auf die man sich (gerade wenn sie kostenlos sind) nicht unbedingt immer verlassen kann. Den eigenen Server kann man selbst verwalten, man kann ihn auf andere WebProvider umziehen lassen und so weiter.

Ein weiterer Vorteil: Es liegt in der Natur des OpenID Services, dass der Service Anbieter genau mitbekommt, auf welche Seite man sich wann einloggt. Es ist hier also eine perfekte Möglichkeit gegeben, Nutzerprofile zu sammeln. Deshalb benutzte ich z.B. nie Services als OpenID Provider, die für ihre Datensammlung bekannt sind (z.B. Google und Yahoo, obwohl man mit ihnen die einfachste OpenID hat). myOpenID war bisher mein Kompromiss: Der Service ist erst einmal nur auf OpenID spezialisiert. Aber natürlich gehört auch er einer Firma..

Im schlimmsten Fall könnte ein externer OpenID Anbieter den Server so manipulieren, dass sich der Besitzer mit der ID eines Nutzers bei Services einloggt. Das wird sicher bei keinem der bekannten Anbieter passieren, aber 100%ig sicher ist man auch hier nur, wenn man seinen eigenen Server hat.

Die Auswahl der Software

Auf openid.net gibt es eine Liste mit bekannten Implementierungen eines OpenID Servers. Diese Liste scheint schon recht alt zu sein, einige der Links zeigen ins Leere. Am viel versprechendsten erschien mir Prairie. Auf der Seite der Software findet man einen ebenfalls sehr alten Download für eine 0.2 Alpha, aber bereits im openid.net Wiki einen Hinweis darauf, dass jemand diese Alpha bereits erweitert und in GitHub abgelegt hat.

Also habe ich mir die Version aus GitHub gezogen, was ja ziemlich einfach auch ohne Git Kenntnisse geht, GitHub bietet einen prominenten Button ZIP, der einem den Inhalt des Repositories als ZIP herunter laden lässt. Also habe ich mir eine Subdomain id.brockha.us angelegt, den Inhalt des Archives dahin übertragen und die Install Routine aufgerufen.

Installation war (wenn man weiß, was OpenID ist) ziemlich selbst erklärend und einfach. Prairie bietet sogar an, den Server im Single- oder MultiUser Betrieb zu fahren. Für den MultiUser Betrieb muss der WebProvider Domain Wildcards akzeptieren (also in meinem Fall *.id.brockha.us nach id.brockha.us übergeben). Das ist bei meinem Provider AllInkl offenbar nicht einstellbar und außerdem werde wohl nur ich meinen OpenID Provider benutzen, so habe ich ihn als SingleUser installiert.

So weit so gut, danach gingen die Probleme los. Wenn ich mich einloggen wollte oder irgendeine andere Seite als die Hauptseite aufrufen wollte, bekam ich PHP Fehler angezeigt, nichts ging nach der Installation wirklich.

Anpassung von Prairie

Ich habe daraufhin relativ viel Zeit in der Auffindung der Probleme und deren Lösungen verbracht. Die meisten Probleme kamen durch Eigenheiten meines Providers AllInk zustande (die bei anderen Providern aber auch auftreten können). GitHub macht es extrem einfach, ein öffentliches Repository in den eigenen Account zu packen und zu bearbeiten: Ich drückte bei dem Prairie Repo auf "Fork", schon hatte ich eine eigene Version in meinem Account, die ich nun bearbeiten und öffentlich verfügbar machen konnte.

Ich will nicht auf die einzelnen Details hier eingehen, was ich verändert habe. Es war gar nicht mal so viel, wer an den Details interessiert ist, kann sich ja die Commit History meines Prairie Repositories ansehen.

Umstellung der OpenID

Wer so schlau war, seine OpenID URL per Delegation zu benutzen, der hat es nun einfach bei der Umstellung. Bei allen Services, bei denen ich OpenID als Login benutze, habe ich meinen Account mit der URL blog.brockha.us verbunden. Diese hatte ich über Delegation so eingestellt, dass meine eigentliche OpenID bei myOpenID benutzt wurde. Ich hatte in der Seite, die unter blog.brockha.us gefunden wird, folgendes im Header hinterlassen:

<link rel="openid.server openid2.provider" href="http://www.myopenid.com/server" />
<link rel="openid.delegate openid2.local_id" href="http://brockhaus.myopenid.com" />

Diesen Eintrag habe ich geändert, so dass auf meinen privaten OpenID Service delegiert wird:

<link rel="openid.server openid2.provider" href="http://id.brockha.us/login" />
<link rel="openid.delegate openid2.local_id" href="http://blog.brockha.us/" />

Auf diese Weise kann ich mich weiterhin wie gewohnt mit der URL blog.brockha.us überall einloggen ohne eine Zuordnung bei all den Services ändern zu müssen. Durch die Änderung wird von meiner OpenID URL dann nicht mehr auf meine ID bei myOpenId delegiert, sondern auf meine private.

Update: Wenn ihr Prairie als Multiuser Server einrichtet, dann sollte die Delegation wie folgt lauten (nicht von mir getestet):

<link rel="openid.server openid2.provider" href="http://id.brockha.us/login" />
<link rel="openid.delegate openid2.local_id" href="http://[username].id.brockha.us/" />

[username] dann entsprechend ersetzen.

Fazit

Dadurch dass mein OpenID Server nur meine ID hosten muss, ist der Einloggvorgang nun wieder rasend schnell erledigt. Außerdem habe nur ich Zugriff auf mein Login Protokoll usw. Die Installation des Prairie Servers ist eigentlich super simpel. Da, wo es Probleme gab, habe ich entsprechende Änderungen eingebaut, von denen ihr profitieren könnt.

Meine Änderungen sind abwärts kompatibel. Dies bedeutet: Meine Version läuft auf allen Servern, auf denen Prairie auch vorher schon lief. Zusätzlich aber auch auf solchen, die Eigenarten wie AllInkl haben. Und auch bei mir gibt es den ZIP Button. Wer sich also auch einen eigenen OpenID Provider bauen will, kann dies gerne mit meinen Anpassungen tun. Es ist wirklich einfach! :-)

Links:

Trackbacks

tioan

tioan on : tioan via Twitter

Continue reading "tioan via Twitter"
@schlingel @ubernauten ggf. das hier nutzen http://t.co/LVF2N2e6

Comments

Display comments as Linear | Threaded

rowi

rowi Read on twitter: on :

Danke für die Anleitung, das installiere ich gerade auch bei mir :-)

Mario

Mario Read on twitter: on :

Wo legt denn Prairie die Login-Daten ab. Braucht es eine Datenbank?

Braucht man ein SSL Zertifikat seine Website, um einen verschlüsselten Zugriff zu haben oder hat OpenID einen eigenes System zur Verschlüsselung?

Grischa

Grischa Read on twitter: on :

Mario: Prairie benötigt MySQL, aber kein SSL. Das OpenID Protokoll hat natürlich eine eigene Verschlüsselung. Login in den eigenen Server geschieht dann aber (wie auch beim normalen Blog Login) unverschlüsselt.

Grischa wrote about: S9Y OpenID Plugin, Nachschlag

Konrad Bauckmeier

Konrad Bauckmeier on :

Ich versuche mich auch gerade an einer Installation:

1. Problem, mein Hoster hat Options deaktiviert. Ich habe daher die beiden Einträge in der .htaccess erst einmal mit einem # deaktiviert

2. Problem: In /install/installer.php in Zeile 46 steht "require_once('../class/Template.class.php');" in der Installation ist der Dateiname aber klein geschrieben

3. Problem: Beim Systemcheck steht: "The asset/avatar directory file is writeable." FAILED Das Verzeichnis avatar wird aber durch die Installation gar nicht nicht angelegt. (Vielleicht sollte man eine dummy-Datei in das Verzeichnis legen?) Dazu kommt, dass in Zeile 493 das Verzeichnis ../asset/avatars (also mit S am Ende!) getestet wird. Auch die Fehlermeldung darunter ist falsch, da hier wieder avatar steht.

@mario: Ja man benötigt scheinbar eine mysql Datenbank

Grischa

Grischa Read on twitter: on :

Zu 1.

Das Options brauchst Du vor allem, wenn Dein Provider "MultiViews" eingeschaltet hat. Hat er das nicht, muss es in der htaccess auch nicht ausgeschaltet werden. Ob das FollowSymlinks benötigt wird, weiß ich gerade nicht, das war schon vorher darin, deshalb habe ich mich darum nicht gekümmert.

Das -MultiViews ist aber eben wichtig. Falls Dein Provider das angeschaltet hat (das hat er wenn Du beim /login PHP Errors bekommst), dann kannst Du eine andere htaccess nehmen, die ich gebaut habe, als ich noch nicht verstanden hatte, dass es an MultiViews liegt:

Options +FollowSymLinks

IndexIgnore */*

RewriteEngine On

RewriteBase /

# Exclude some stuff from rewriting. These files should be opened directly

RewriteRule \.(css|js|png|gif|jpg|htm|html)$ - [L]

RewriteRule ^install/installer.php$ - [L]

RewriteRule ^upload_file.php$ - [L]

RewriteRule ^get_file.php$ - [L]

# If a file is requested, that is not existing, redirect to index.php

#RewriteCond %{REQUEST_FILENAME} !-f

#RewriteCond %{REQUEST_FILENAME} !-d

RewriteCond %{REQUEST_URI} !-f

RewriteCond %{REQUEST_URI} !-d

RewriteRule . index.php

Die lege ich vielleicht mal als Alternative ins Archiv.

Grischa

Grischa Read on twitter: on :

Zu 3: Es muss das Verzeichnis avatars sein (mit S). Die Routine ist also richtig, aber die Meldung nicht. Und ja, ich werde da mal ein dummy file hinterlegen. :-)

Konrad Bauckmeier

Konrad Bauckmeier on :

Nachtrag: Problem 2 ist scheinbar hausgemacht. Im Tarball sind die Datainamen korrekt großgeschrieben, nur auf meinem Server sind sie klein angekommen. Ich werde jetzt das Ganze noch einmal hochladen.

Konrad Bauckmeier wrote about: Spielplatz Alte Dresdner Straße (Lausa)

Konrad Bauckmeier

Konrad Bauckmeier on :

Nachtrag2: So, nun sieht eigentlich alles schon ganz gut aus. Leider habe ich noch das Problem, dass prairie scheinbar korrekt aufgerufen wird, aber nach der Weiterleitung zu prairie und der dortigen Bestätigung des Logins der anfragenden Seite wird offenbar keine positive Nachricht an die aufrufende Webseite zurückgegeben. Ich bin also trotzdem nicht eingelogged.

Ich habe zunächst im Error-Log des Webservers die folgende Fehlermeldung gefunden:

mod_fcgid: stderr: PHP Warning: Call-time pass-by-reference has been deprecated in /var/www/web5/html/openid/prairie/class/Openid.class.php on line 503

daraufhin habe ich foldendes meiner .htaccess zugefügt (ich verwende PHP 5.2.x:

php_value allow_call_time_pass_reference 1

Jetzt ist der o.g. Fehler nicht mehr im Error-Log des Webservers, aber leider funktioniert das Login trotzdem nicht. (Ich habe es mit meinem Blog und mit getsatisfaction.com versucht.)

Was kann ich noch versuchen/testen/prüfen? Danke für die Hilfe!

Grischa

Grischa Read on twitter: on :

So, die avatars Meldung und die Depreciation in Openid.class.php habe ich gefixt und die Änderung nach GitHub geladen.

Warum es nicht bei Dir funktioniert.. Hmm.. Das kann ich Dir so natürlich nicht sagen, bei mir funktioniert Prairie bei allen von mir getesteten Services bisher problemlos.. Gehst Du über eine Delegation oder nimmst Du die direkte URL des Servers? Wenn direkt: Nimmst Du evtl [prairie-url]/login als URL? Das wäre falsch, diese ID ist nur im Delegation wichtig. Es muss [prairie-url] sein, ohne irgendeinen Pfad dahinter.

Und hast Du wie ich ein SingleUser System aufgesetzt oder die MultiUser Version? Letzteres geht wie geschrieben ja nur, wenn Du Subdomain Wildcards einrichten kannst, was vermutlich nicht der Fall sein wird, wenn Dir schon Options in der htaccess verwehrt wird..

Grischa wrote about: BrowserID als Login Option für Serendipty

Konrad Bauckmeier

Konrad Bauckmeier on :

Hm, das ist offenbar doch komplizierter als ich dachte. Mal der Reihe nach:

1. die Angabe von Options ist mir zwar scheinbar nicht gestattet, aber offenbar sind diese bei meinem Hoster sysprovide.de standardmäßig "richtig" eingestellt, ich erhalte keine Fehlermeldungen.

2. ein Eintrag mit avatar ohne s habe ich noch in Zeile 499 der installer.php gefunden. Das ist aber nicht so schlimm, denn es ist die Erfolgsmeldung. In Openid.class.php habe ich in der neuen Version keine Änderung festgestellt, was ist Depreciation?

3. die Delegation habe ich bei meinen Versuchen erst einmal weggelassen um es nicht zusätzlich zu verkomplizieren. Der Eintrag auf www.dd4kids.de ist mit der serendipity_event_openid erzeugt. Dort gibt es noch keine Möglichkeit OpenID2 anzugeben? Ich kann die Eintragungen natürlich von Hand in serendipity_event_head_nugget eintragen.

4. Bei MultiUser hatte ich auch festgestellt, dass ich in confixx keine Wildcard eintragen darf. Ich hatte mir dann so beholfen, dass ich für den einen Benutzer die Domain konrad.id.dd4kids.de fest angelegt hatte.

5. nachdem MultiUser bei mir nicht funktionierte hatte, habe ich testweise auf SingleUser umgestellt. Das Problem ist aber das gleich geblieben:

bei der Angabe der ID auf einem fremden System wird zu id.dd4kids.de gewechselt, wo ich mich anmelden muss und dann die Rückfrage beantworten kann, ob ich mich für die Seite authentifizieren möchte. (Cancel/ Proceed) Egal was ich drücke, werde ich dann auf die ursprüngliche Seite geschickt, aber bin nicht eingeloggt.

Grischa

Grischa Read on twitter: on :

1: Offenbar.

2: Gefixt.

3: Ich habe bereits ein Update für das OpenID Plugin hoch geladen, das das ermöglicht. Sollte morgen über Spartacus verfügbar sein.

4: Hast Du es mal im SingleUser Betrieb getestet? Vielleicht geht das besser? Brauchst Du mehrere Nutzer auf Deinem OpenID Server?

5: Oh.. Okay.. ^^

Hmm.. Was gibst Du denn jetzt genau als Deine ID URL ein? Was hast Du im MultiUser, was im SingleUser Betrieb eingegeben?

Ich kann hier leider echt nur raten, da es bei mir halt völlig problemlos funktioniert. Kann mir nur vorstellen, dass irgendwas am Provider das verhindert (kann PHP bei Dir z.B. externe URLs aufrufen? Ich weiß gerade nicht, ob Prairie das benötigt..) oder das halt irgendetwas falsch konfiguriert / ausgeführt wurde.

Ich vermute, ich werde Dir nicht weiter helfen können.. :-(

Konrad Bauckmeier

Konrad Bauckmeier on :

Ja, ich werde prairie aufgeben. Danke Dir trotzdem für die Hilfe!

Ursprünglich wollte ich wenigstens das OpenID Plugin in S9Y behalten und damit eine Delegation auf Google einzurichten, aber das habe ich auch nicht hinbekommen (nicht mein Tag heute, myopenid ging, Google nicht).

Mir ist außerdem aufgefallen dass ich in S9Y die im Benutzerprofil die zum Anmelden hinterlegte URL nicht löschen kann. Vielleicht könntest du da noch einbauen, dass leere URLs nicht auf Funktion getestet werden?

Grischa

Grischa Read on twitter: on :

Ah, ich sehe gerade bei Dir, dass Du offenbar Delegation und MultiUser benutzt. Gut, Deine Delegation ist falsch eingerichtet. Die müsste wie folgt lauten:

(link rel="openid.server openid2.provider" href="http://id.dd4kids.de/login" /)

(link rel="openid.delegate openid2.local_id" href="http://konrad.id.dd4kids.de/" /)

.. runde Klammern bitte entsprechend ersetzen..

Der Server Eintrag beschreibt den Server, der die ID zur Verfügung stellt, also nicht Deine OpenID, da muss also der Link ohne konrad drin sein. Diese URL wäre für alle User auf Deinem Prairie Server immer die selbe. Außerdem fehlte die Erweiterung /login. Im Delegate kommt dann die ID rein, auf die Du delegieren möchtest.

Außerdem kann Prairie OpenID2, deshalb solltest Du diese Attribute mit rein nehmen. Ich weiß sogar ehrlich gesagt nicht mal, ob Prairie überhaupt noch die alte Version 1 unterstützt, dann wäre Dein Eintrag deshalb schon problematisch (weil Du so angibst, nur Version 1 zu unterstützen).

rowi

rowi Read on twitter: on :

Nachdem ich etwa ein Dutzend mal die Installation gestartet habe bin ich zu drei Erkenntnissen gelangt:

- eine halbwegs beschriebene Textdatei ist für die Konfiguration tausendmal besser als ein Webinterface mit Stichworten.

- Der Alpha Status ist berechtigt bis optimistisch

- Prairie läuft nun wohl bei mir, aber ich habe kein Vertrauen in diese Frickel*******

Ich denke ich werde es mal wie Steffen mit SimpleID versuchen, er hatte sich im Oktober wohl die gleichen Gedanken gemacht (http://kaffeeringe.de/blog/einfache-php-loesung-zum-identitaets-management.680.html)

Grischa

Grischa Read on twitter: on :

Ah, danke für Deine Einschätzung, interessant!

Komisch, ich kann keines davon nachvollziehen, wie gesagt: War bei mir alles ziemlich simpel zu installieren (jdf mit der von mir gepatchten Version und wenn man weiß, was OpenID ist).

Aber wenn ich mir das so ansehe, scheint es nur mir so gegangen zu sein.

Was für Frickeleien waren da denn nötig bei Dir?

Konrad Bauckmeier

Konrad Bauckmeier on :

Also auf mich hat prairie eigentlich einen guten Eindruck gemacht. Meine Probleme waren größtenteils hausgemacht. Ansonsten war es logisch und nachvollziehbar.

OK, ich bin am Ende daran gescheitert, dass ich nicht in der Lage war, die letzte Phase der Kommunikation zu debuggen. Jemand mit etwas mehr Hintergrundwissen hätte das sicherlich gelöst bekommen.

Grischa

Grischa Read on twitter: on :

Sag das nicht.. Ich habe gerade *exakt* das selbe Problem, das Du mit Prairie hast mit SimpleId. Das Ding ist konfiguriert und läuft, aber kein Service will das Login akzeptieren.

Nun gut, da Prairie bei mir problemlos läuft, bin ich da nun auch etwas faul zu schauen, was bei dem nun nicht rund läuft.

Vielleicht probierst Du den mal, vielleicht geht der ja bei Dir? :-D In dem Artikel, den rowi da verlinkt hat, ist der SimpleId Server beschrieben. Konfiguration ist ein langes Textfile, allerdings ist das gut verständlich.

Grischa wrote about: Single Sign-On mit BrowserID

Christian

Christian Read on twitter: on :

Hi ich habe das mal installiert, die install klappt auch ganz gut, aber wenn ich dann versuche unter /login mich einzuloggen bekomme ich einen Internal Server error. Wenn ich den loginskript mit dem php interpreter mal direkt bearbeite bekomme ich:

"PHP Fatal error: Call to undefined function GetFromURL() in /var/www/virtual/sangyye/id.sangyye.me/login.php on line 170"

Ich benutze php 5.4

Grüße,

Christian

Christian

Christian Read on twitter: on :

Ich habe das nun mit der anderen htaccess so weit das ich auf /login komme, aber leider muss ich sagen kann ich mich nicht einloggen. Ich bekomme immer falsches passwort oder emailaddresse obwohl ich mir bei beidem absolut sicher bin.

Grüße,

Christian

Grischa

Grischa Read on twitter: on :

Gut, ich denke das erst lag genau daran, was ich im Artikel beschrieben hatte: Dein Provider erlaubt Dir nicht, Options in der htaccess zu setzen. Scheinbar wurde das bei Dir mit der alternativen htaccess gelöst.

Warum der Server nun sagt, dass das Login nicht stimmt, kann ich so ohne weiteres natürlich nicht beantworten. Du hast Dich mit der angegebenen EMail und Passwort eingeloggt? Hast Du mal in die Datenbank geschaut, was da als EMail für Dich gespeichert wurde?

Ich hatte ganz am Anfang mal die schräge Situation, dass da ein Punkt anstatt eines @ gespeichert wurde. Da ich das aber nicht mehr nachvollziehen konnte, schob ich es auf eine Fehleingabe meinerseits. Ist es bei Dir vielleicht so etwas?

Steffen Voß

Steffen Voß Read on twitter: on :

all-inkl.com kann Wildcard-Subdomains. Zumindest im Business-Tarif kann ich als Subdomain *.example.com anlegen. So habe ich zum Beispiel eine Multiinstallation von Wordpress hinbekommen.

Add Comment

E-Mail addresses will not be displayed and will only be used for E-Mail notifications.
This blog allows you to add audio comments using audioboo.fm. Create a new boo and enter the link to the page into the boo field.
record
If you enter your twitter name, your timeline will get linked to your comment.
Promote one of your recent articles
This blog allows you to announce one of your recent blog articles with your comment. Please enter your the corresponding URL as homepage and a selection box will pop up letting you choose an article. (Javascript needed)
(Requirements: 1 comments written)
Standard emoticons like :-) and ;-) are converted to images.
tweetbackcheck