I'm implementing OpenID for SemanticScuttle, your self-hosted social bookmark manager. To log in with OpenID, you need to know your OpenID URL, which many people do not know, and don't want to know. Most know their email address, and thanks to WebFinger, this is all you have to know!
WebFinger enables applications to discover information about people by just their e-mail address - for example their OpenID URL!
I didn't find a single standalone WebFinger library for PHP, so I asked on StackOverflow, but did not get any responses. Failed to stand on the shoulders of giants, I went the hard way and implemented it all myself: Net_WebFinger, based on XML_XRD.
Implementation
WebFinger weaves RFC 6415: Web Host Metadata with LRDD which both use XRD files.
Thus the first step was to build a clean XRD library for PHP, with an intuitive API and 100% unit test coverage. I proposed the XML_XRD package on 2012-02-01, called for votes 8 days later. It was accepted with 11 votes. Extensive documentation does also exist now.
After the foundation was laid, I proposed the Net_WebFinger package. It was accepted as new PEAR this night, and just some minutes ago it got its first official release and a lot of documenation.
Usage
So, discovery is easy now! First, install the PEAR package:
$ pear install net_webfinger-alpha
Now the PHP code:
<?php require_once 'Net/WebFinger.php'; $wf = new Net_WebFinger(); $react = $wf->finger('user@example.org'); if ($react->openid !== null) { echo 'OpenID provider found: ' . $react->openid . "\n"; } //list all other links: foreach ($react as $link) { echo 'Link: ' . $link->rel . ' to ' . $link->href . "\n"; } ?>
WebFinger CLI
Net_WebFinger ships with a command line client that you can use to try it out. Find it with
$ pear list-files net_webfinger|grep cli doc /usr/share/php/docs/Net_WebFinger/examples/webfinger-cli.php
Yahoo and Google already support WebFinger. Distributed social networks like status.net (that powers identi.ca) and Diaspora use WebFinger to distribute public encryption keys, OStatus and Salmon URLs. You can try one of those user addresses, too.
$ php /usr/share/php/docs/Net_WebFinger/examples/webfinger-cli.php klimpong@gmail.com Discovering klimpong@gmail.com Information secure? false OpenID provider: http://www.google.com/profiles/klimpong Link: http://portablecontacts.net/spec/1.0: http://www-opensocial.googleusercontent.com/api/people/ Link: http://portablecontacts.net/spec/1.0#me: http://www-opensocial.googleusercontent.com/api/people/102024993121974049099/ Link: http://webfinger.net/rel/profile-page: http://www.google.com/profiles/klimpong Link: http://microformats.org/profile/hcard: http://www.google.com/profiles/klimpong Link: http://gmpg.org/xfn/11: http://www.google.com/profiles/klimpong Link: http://specs.openid.net/auth/2.0/provider: http://www.google.com/profiles/klimpong Link: describedby: http://www.google.com/profiles/klimpong Link: describedby: http://www.google.com/s2/webfinger/?q=acct%3Aklimpong%40gmail.com&fmt=foaf Link: http://schemas.google.com/g/2010#updates-from: https://www.googleapis.com/buzz/v1/activities/102024993121974049099/@public
$ php /usr/share/php/docs/Net_WebFinger/examples/webfinger-cli.php singpolyma@identi.ca Discovering singpolyma@identi.ca Information secure? false OpenID provider: http://identi.ca/singpolyma Link: http://webfinger.net/rel/profile-page: http://identi.ca/singpolyma Link: http://gmpg.org/xfn/11: http://identi.ca/singpolyma Link: describedby: http://identi.ca/singpolyma/foaf Link: http://apinamespace.org/atom: http://identi.ca/api/statusnet/app/service/singpolyma.xml Link: http://apinamespace.org/twitter: https://identi.ca/api/ Link: http://schemas.google.com/g/2010#updates-from: http://identi.ca/api/statuses/user_timeline/15779.atom Link: salmon: http://identi.ca/main/salmon/user/15779 Link: http://salmon-protocol.org/ns/salmon-replies: http://identi.ca/main/salmon/user/15779 Link: http://salmon-protocol.org/ns/salmon-mention: http://identi.ca/main/salmon/user/15779 Link: magic-public-key: data:application/magic-public-key,RSA.jylO6IUdOFhUadS0bkvq4Vkx_fh... Link: http://ostatus.org/schema/1.0/subscribe: http://identi.ca/main/ostatussub?profile={uri} Link: http://specs.openid.net/auth/2.0/provider: http://identi.ca/singpolyma