Kategorien
Webdesign

OpenID demystified – Teil 2 mit Google Account

Im ersten Teil haben wir die Authentifizierung über OpenID mit der PHPOpenID Klasse durchgespielt. Dabei konnten wir Nutzerdaten über die OpenID Erweiterung SReg abfragen. Diese wird jedoch nicht von allen OpenID Anbietern unterstützt. In diesem zweiten Teil wollen wir uns die Erweiterung „AX“ für OpenID genauer anschauen und probieren, ob ein Login auch über eine Google OpenID funktioniert.

Im ersten Teil haben wir die Authentifizierung über OpenID mit der PHPOpenID Klasse durchgespielt. Dabei konnten wir Nutzerdaten über die OpenID Erweiterung SReg abfragen. Diese wird jedoch nicht von allen OpenID Anbietern unterstützt. In diesem zweiten Teil wollen wir uns die Erweiterung „AX“ für OpenID genauer anschauen und probieren, ob ein Login auch über eine Google OpenID funktioniert.

Was ist meine OpenID von Google?

Wenn Sie GoogleMail Nutzer oder irgendeinen Google Dienst nutzen, so haben Sie einen Google Account und damit auch eine OpenID. Wenn Sie ein Blog auf Blogger.com oder Blogspot.com besitzen, so können Sie als ihre OpenID den URL zu ihrem Blog benutzen. In meinem Fall ist das http://fetzert.blogspot.com/. Wenn Sie ihre Blogger URL als OpenID in unser Formular oben eingeben, werden Sie automatisch weitergeleitet auf die Seite von Blogger und müssen sich dort einloggen. Alles funktioniert wie gehabt – doch was, wenn Sie keine OpenID in der Form eines URL haben? Selbst dann haben Sie eine OpenID von Google. Nur, dass diese etwas anders aussieht – beziehungsweise nicht mehr die Form eines URL hat. Google setzt hier auf die vorher erwähnten XRI.

Damit unser Login auch mit Google funktioniert müssen Sie als URL für Ihre OpenID die Adresse http://www.google.com/accounts/o8/id in das Login-Feld eintippen. Sie werden dann automatisch auf die Login-Seite von Google weitergeleitet und können den Zugriff der Applikation zulassen.

OpenID Authentifizierung über einen Google Account

Wenn Sie dann auf die OpenIdReturn.php weitergeleitet werden, werden Sie feststellen das Sie keine Information von Google mitgeliefert bekommen haben? Also das Array in welchem eigentlich die Nutzerdaten stecken sollten, ist leer geblieben. Warum denn das?

Es lohnt sich hier, ein Blick hinter die Kulissen zu wagen. Dazu können Sie im Browser einfach einmal die http://www.google.com/accounts/o8/id aufrufen. In der Regel werden Sie nun gefragt ob Sie eine Datei herunterladen möchten oder es wird ihnen folgender XML Code angezeigt (dieser steckt auch in der Datei, welche Sie herunterladen würden).

<?xml version="1.0" encoding="UTF-8"?>
<xrds:XRDS xmlns:xrds="xri://$xrds" xmlns="xri://$xrd*($v*2.0)">
<XRD>
<Service priority="0">
<Type>http://specs.openid.net/auth/2.0/server</Type>
<Type>http://openid.net/srv/ax/1.0</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/mode/popup</Type>
<Type>http://specs.openid.net/extensions/ui/1.0/icon</Type>
<Type>http://specs.openid.net/extensions/pape/1.0</Type>
<URI>https://www.google.com/accounts/o8/ud</URI>
</Service>
</XRD>
</xrds:XRDS>

Hierbei handelt es sich um ein XML Dokument auf basis des XRDS Schemas. Was ist denn das schon wieder? Ganz vereinfacht ausgedrückt, handelt es sich dabei um ein Dokument, in welchem Metadaten über eine bestimmte Quelle stecken. In unserem Fall wird es verwendet um die Dienste, welche mit einer Resource verbunden sind, in dem Discovery Prozess aufzufinden. Hier findet sich also in dem XRDS Dokument die Adressen für den OpenID Server von Google welcher unter https://www.google.com/accounts/o8/ud liegt. Zudem sagt uns das XRDS Dokment, welche Dienste OpenID von Google unterstützt – eine erste Beobachtung ist, das OpenID 1.1 nicht unterstützt wird. Zudem steht dort nirgendwo etwas von der Erweiterung SReg – das erklärt, warum unser Array leergeblieben ist. Jedoch unterstützt Google AX, also den Attribute Exchange in der Version 1.0. Das wollen wir uns als nächstes etwas genauer anschauen.

Attribute Exchange über OpenID

Nun wollen wir einmal versuchen, dieselben Daten von Google zu erhalten, wie wir sie von myOpenID über SReg erhalten haben. Google verwendet für den Informationstransfer ausschließlich das Attribute Exchange Schema. Dazu müssen wir unser Script etwas anpassen, indem wir komplett auf AX zurückgreifen.

openIdAuthentification/index.php

<?php
if (!isset($_POST['submit'])) {
?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
"DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de" lang="de">
<head>
<title>Mit OpenID anmelden</title>
</head>
<body>
<form method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
Personalisieren Sie diese Webseite, indem Sie sich mit Ihrer OpenID <img src="images/openid.gif" alt="OpenID Icon"> anmelden.<br/>
<input type="text" name="id" size="30" />
<br />
<input type="submit" name="submit" value="Einloggen" />
</form>
<?php
} else {
// schauen, ob überhaupt etwas eigegeben wurde
if (trim($_POST['id'] == '')) {
echo "<h1>Geben Sie eine OpenID ein!</h1>";
}
// die Bibliothek einfügen
require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";
require_once "Auth/OpenID/AX.php";
// Sessions erzeugen, mit dieser Session wird später der Nutzer erkannt
session_start();
// Sofern nicht vorhanden, wird ein Flatfilespeicherort für OpenID Authentifizierungen erzeugt
$store = new Auth_OpenID_FileStore('./OpenIdStorage');
// einen neuen OpenID Konsumenten erzeugen
$consumer = new Auth_OpenID_Consumer($store);
// Beginn des Anmeldeprozesses durch Erzeugung einer neuen Anfrage bei dem OpenID Anbieter
$auth = $consumer->begin($_POST['id']);
if (!$auth) {
echo "<h1>Geben Sie eine OpenID ein!</h1>";
}
// AX Anfrage erzeugen - also die Anfrage, über die Nutzerdaten zurückgesendet werden sollen
$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',
'fullname' => 'http://schema.openid.net/namePerson/'
'country' => 'http://schema.openid.net/contact/country/home',
'dob' => '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',
'about' => 'http://schema.openid.net/media/biography',
'image' => 'http://schema.openid.net/media/image/default',
);
$ax_request = new Auth_OpenID_AX_FetchRequest();
if ($ax_request) {
foreach($axRequestProfileData as $key => $url){
$ax_request->add(Auth_OpenID_AX_AttrInfo::make($url, 1, true, $key));
}
$auth->addExtension($ax_request);
}
else {
echo "<h1> Die Nutzerdaten konnten nicht abgefragt werden</h1>";
}
// Weiterleitung auf den OpenID Anbieter zur Authentifizierung
$url = $auth->redirectURL('http://www.devmag.net/openIdAuthentification', 'http://www.devmag.net/openIdAuthentification/OpenIdReturn.php');
header('Location: ' . $url);
}
?></body>
</html>

Wie sie sehen, hat sich an dem Code selbst nicht sehr viel verändert. Anstatt der „sreg.php“ wird die „ax.php“ geladen. In dem Array $axRequestProfileData wird angegeben, welche Daten Sie auslesen möchten. Die build() Funktion aus der SReg Bibliothek wird hier durch die make() Funktion ersetzt. Diese nimmt als Argumente den URI der Typendefinition und drei optionale Argumente, nämlich die Anzahl – wie oft Sie die Information möchten (Standard ist 1), ob Sie die Information unbedingt voraussetzen (Standard ist false) und den Schlüssel, über welchen Sie später im Array mit den Informationen, die an Sie zurückgekommen sind, auf diese zugreifen.

Es gibt eine Reihe von standardisierten Datentypen. Vielleicht fällt Ihnen auf, dass es zwei verschiedene URIs für die Typendefinitionen gibt, sowohl http://schema.openid.net als auch http://axschema.org. Es ist immer noch nicht abschließend geklärt, wo die AX Schema Definition liegen soll – daher können Sie bisher beide benutzen, wobei Sie jedoch bei manchen Anbietern Probleme bekommen. So unterstützt MyOpenID lediglich die Verweise auf http://schema.openid.net, während Google OpenID sowohl als auch unterstützt. Diese offene Frage ist vor allem für Entwickler problematisch und hat schon zu hitzigen Diskussionen geführt, da noch nicht alle Anbieter auf axschema.org umgestiegen sind.

Um die Daten auszulesen, müssen sie auch die OpenIdReturn.php bearbeiten.

openIdAuthentification/OpenIdReturn.php

<?php
// Wiederum die passenden Includes
require_once "Auth/OpenID/Consumer.php";
require_once "Auth/OpenID/FileStore.php";
require_once "Auth/OpenID/AX.php";
// die Session wird gestartet
session_start();
// ein Speicherort für die OpenID Daten erzeugen, sofern noch nicht vorhanden
$store = new Auth_OpenID_FileStore('./OpenIdStorage');
// es wird wiederum ein OpenID Consumer erzeugt über welchen die Antwort des OpenID Anbieters
// über den Status der Anfrage ausgelesen wird
$consumer = new Auth_OpenID_Consumer($store);
$response = $consumer->complete('http://www.devmag.net/openIdAuthentification/OpenIdReturn.php');
// im Fall eines erfolgreichen Logins, wird die Session Variable auf true gesetzt.
// durch eine einfache Überprüfung kann nun auf allen Unterseiten überprüft werden, ob
// diese Session Variable den Wert true hat - der Benutzer also eingeloggt ist
if ($response->status == Auth_OpenID_SUCCESS) {
$_SESSION['OPENID_AUTH'] = true;
// die Informationen, die der OpenID Anbieter übermittelt hat, auslesen
$ax = Auth_OpenID_AX_FetchResponse::fromSuccessResponse($response);
echo "<pre>";
var_dump($ax->data);
echo "</pre>";
}
else
{
$_SESSION['OPENID_AUTH'] = false;
}
?>

Probieren wir zunächst die Authentifizierung mit myOpenID aus. Der Prozess läuft zunächst ganz normal ab, sie können wählen, welche Informationen Sie von ihrem Profil an die zu verifizierende Webseite weitergeben möchten. Hier sehen Sie bereits, das dort nichts von einem Profilbild steht, welches jedoch über ‚image‘ => ‚http://schema.openid.net/media/image/default‘ angefordert wurde.

OpenID Authentifizierung auf MyOpenID bei Verwendung von Attribute Exchange

Die Ausgabe der erhaltenen Daten nach erfolgter Authentifizierung bei myOpenID sieht wie folgt aus:

Der Variable Dump der Rückgabewerte von MyOpenID

Insgesamt wird deutlich, dass uns myOpenID nicht wirklich alle Daten übermittelt, die eigentlich angefordert waren. Wie verhält es sich mit Google?

Es stellt sich heraus, das Google noch geiziger ist. Es wird lediglich die Emailadresse des Nutzers herausgerückt. Das ist ein herber Dämpfer in dem Versuch unsere Webseite nach Authentifizierung zu personalisieren. Es sind hauptsächlich Datenschutzgründe, die angeführt werden – die ja zum Teil berechtigt sind. Gerade Google muss vorsichtig bei der Weitergabe von Nutzerdaten an Dritte sein, da Google stets unter besonderer Aufsicht steht – obgleich des Firmenmottos „Don’t be evil“. Es gibt jedoch auch Dienste die bei Google auf einer weißen Liste stehen – an die versendet Google mehr Informationen, etwa plaxo.com. Yahoo! unterstützt weder SReg noch AX – aber eine Implementierung soll irgendwann folgen. Ein Gedanke der dabei sicherlich aufgegriffen wird, ist der Gedanke der multiplen Identitäten, die hinter einer OpenID stecken. So können Sie zum Beispiel bei myOpenID bereits mehrere Identitäten festlegen – für bestimmte Webseiten, können Sie so entscheiden, welche Information sie weitergeben möchten und welche nicht. Man könnte sich zum Beispiel vorstellen, dass man eine Identität mit den grundlegenden Informationen für die Verwendung in Blogs hinterlegt und, vielleicht eine andere, die eher für geschäftliche Zwecke verwendet wird.

Warum ist Attribute Exchange spannend?

Wie bereits gesagt, bietet sich durch Attribute Exchange die Möglichkeit an, ihre Seite oder ihr Blog für Ihre Benutzer zu personalisieren, indem Sie automatisch etwa ein Nutzerbild laden oder den Besucher persönlich ansprechen. In Verbindung mit einer Blogsoftware können Sie so zum Beispiel einem Leser ihres Blogs direkt nach Authentifizierung die neuesten Folgekommentare in Beiträgen zeigen, in denen der Nutzer selbst Kommentare verfasst hat. So wäre das Abonnieren von Kommentaren für bestimmte Beiträge vielleicht obsolet.

Bisher dreht sich OpenID jedoch vor allem um den Nutzen für den Webandwender, also den Besitzer eines Google oder eines Facebook Kontos. Doch bietet OpenID zum Beispiel auch für Institutionen viele Möglichkeiten. Man könnte sich etwa für Universitäten die Verwendung von OpenIDs für die Studenten vorstellen, über welche diese sich für Prüfungen, Seminare oder Kurse anmelden und in Foren an Diskussionen teilnehmen. Man könnte so auf eine OpenID das Emailkonto, sowie das Konto bei der Universitätsbibliothek oder für die Bezahlsysteme in der Mensa zusammenlaufen lassen. Dafür können verschiedene Tiefen der Verknüpfung über multiple Identitäten gewählt werden. OpenID macht dies ohne großen Aufwand möglich, da lediglich die vorhandenen einzelnen Nutzerkonten miteinander verknüpft werden müssen. Genauso bieten sich auch viele Anwendungsmöglichkeiten für Firmen und deren firmeninternen Webpräsenzen an, die ja oftmals auch mit den verschiedensten Diensten aufwarten.

Die Integration über eine OpenID ist systemübergreifend einfach, da lediglich eine Schnittstelle bereitgestellt werden muss, über welche die Nutzer die verschiedenen Dienste miteinander verknüpfen. Was auf dieser Ebene noch geschehen wird ist sehr spannend, bietet sehr viele Potentiale und wird das Internet der Zukunft maßgeblich gestalten.

Von Thiemo Fetzer

Thiemo Fetzer lebt seit 2008 in London und promoviert dort im Fachbereich "Entwicklungsökonomie" an der London School of Economics. Zuvor hat er Wirtschaftswissenschaften, Mathematik und Informatik in Magdeburg und Ulm studiert.

2 Antworten auf „OpenID demystified – Teil 2 mit Google Account“

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.