The openid-ldap project provides a simple OpenID to LDAP gateway that supports Active Directory so you can leverage your existing SSO database hosted in LDAP to provide OpenID logins.
All the documentation lives in docs/README. Configuration is mostly a matter of unpacking the source into an apache hosted directory, editing ldap.php as described to contain the correct ldap URIs, and configuring apache. The LDAP configuration is relatively straight-forward if you’re familiar with setting up LDAP authentication elsewhere. The apache part took some tinkering for my setup.
I ran into three problems, the first was needing to modify the filter to remove ‘(mail=*)’ since these weren’t mail enabled accounts. I used ldapsearch (example in the README) based on my settings in ldap.php to see that no accounts were getting returned and realized these accounts weren’t mail enabled.
The next problem was because my production webservers are behind a load balancer and the configuration wants to use mod_proxy to connect back to itself, which would try to go back out the backside of the load balancer and cause all sorts of confusion. I used an internal hostname to pass the proxied requests directly back to the server. You’ll see this in the attached apache configuration below
The third was because of the load balancer and I discovered this by turning debug to true in index.php and dumping a log file in /tmp. Part of the authentication request was going to different servers. Only having a single server in this particular pool resolved that.
The test page on openid-ldap.org didn’t work for me and failed with “Authentication error; not a valid OpenID”, but logging into livejournal worked okay.
<VirtualHost *:80> ServerAdmin webmaster@example.org ServerName openid.example.org RewriteEngine On RewriteRule ^/(.*) https://openid.example.org/$1 [R,L] </VirtualHost> <VirtualHost *:80> ServerName openid RewriteEngine On RewriteCond %{HTTPS} !=on RewriteRule ^/(.*) https://openid.example.org/$1 [R,L] </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@example.org ServerName openid.example.org ServerAlias openid DocumentRoot /var/www/example.org/openid <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/example.org/openid> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny allow from all </Directory> ErrorLog /var/log/apache2/openid.example.org-error.log LogLevel warn CustomLog /var/log/apache2/openid.example.org-access.log combined <Proxy https://openid-internal.example.org/*> Order allow,deny Allow from all </Proxy> ServerSignature On RewriteEngine On RewriteCond %{REQUEST_URI} !^/(.+)\.php(.*)$ RewriteCond %{THE_REQUEST} ^[A-Z]{3,9}\ /([A-Za-z0-9]+)\?(.*)\ HTTP/ RewriteRule ^/(.*)$ https://openid-internal.example.org/index.php?user=%1&%2 [P] RewriteCond %{REQUEST_URI} !^/(.+)\.php(.*)$ RewriteRule ^/([A-Za-z0-9]+)$ https://openid-internal.example.org/index.php?user=$1 [P] </VirtualHost>
I’ve been thinking of trying something similar – this will be a very handy reference. Thanks! So far, thanks to LPK, we’ve got a single LDAP user store governing ssh, svn, various django-driven web apps, openvpn, and more. This will add the final piece.