OpenId Attribute Exchange mit PHP und Janrain
22.05.2009Ich habe in letzter Zeit wieder mehr mit OpenID gemacht und dabei “Attribute Exchange” entdeckt.
Diese OpenID Erweiterung ermöglicht es, Userdaten des Accounts an die anfragende Seite zu übertragen. Im Gegensatz zur verbreiteten sreg Erweiterung, unterstützt sie aber eine Reihe zusätzlicher Attribute (z.B. Trennung von Vorname und Nachname, mehrere Profil-Urls…). Neben Google (Doku) unterstützt auch myopenid diese Erweiterung.
Die Implementierung ist eigentlich recht schmerzfrei. Leider habe aber nirgends guten Beispielcode gefunden und die Dokumentation zu dem Thema ist insgesamt ungenügend, so dass ich die einfache Lösung unten erst mit viel Trial and Error gefunden habe:
Entscheidend war folgende Information (danke an Rakuno Futani):
Anders als in der Doku angebeben, muss als Namespace anscheinend http://schema.openid.net für die Attribute genutzt werden. Andere Namespaces, z.B. http://axschema.org/contact/email gunktionieren zumindest mit MyOpenid nicht. Erschwerend kommt während der Entwicklung hinzu, dass Google z.B. die Attribute nur bei der allerersten Anfrage mitsendet und davon ausgeht, dass der anfragende Server diese Daten erfolgreich speichert. Eine leere Response heißt also nicht unbedingt, dass die Anfrage falsch war.
Hier die Beispielimplementierung mitilfe der Janrain PHP Library (die übrigens dringend mal als PHp5 Verison rauskommen sollte).
Request
Dem Request fügt man die AX-Erweiterung hinzu und gibt an, welche Userdaten geholt werden sollen.
<?php $axRequestProfileData = array( 'email' => 'http://schema.openid.net/contact/email', 'username' => 'http://schema.openid.net/namePerson/friendly', 'firstname' => 'http://schema.openid.net/namePerson/first', 'lastname' => 'http://schema.openid.net/namePerson/last', 'country' => 'http://schema.openid.net/contact/country/home', 'birthday' => 'http://schema.openid.net/birthDate', 'gender' => 'http://schema.openid.net/gender', 'language' => 'http://schema.openid.net/pref/language', 'web' => 'http://schema.openid.net/contact/web/default', 'blog' => 'http://schema.openid.net/contact/web/blog', 'about' => 'http://schema.openid.net/media/biography', 'image' => 'http://schema.openid.net/media/image/default', 'fullname' => 'http://schema.openid.net/namePerson/' );
$ax_request = new Auth_OpenID_AX_FetchRequest(); if ($ax_request) {
foreach($axRequestProfileData as $alias => $url){
$ax_request->add(Auth_OpenID_AX_AttrInfo::make($url, 1, true, $alias));
}
$request->addExtension($ax_request);
}
?>
Response
Nach der Autentifizierung erhält man dann die Daten aus der Response so:
<?php $ax = Auth_OpenID_AX_FetchResponse::fromSuccessResponse($response); var_dump($ax->data); ?>