Maximillian Dornseif home

Appengine Authentifizierung Teil I

Moderne Authentifizierung sollte den Nutzern möglichst wenig Wissen um Accounts und Passwörter abverlangen. Es ist nicht nur unsicher, wenn Nutzer für verschiedene interne Applikationen verschiedene Nutzernamne und Passwörter wissen müssen, sondern auch unakzeptabel. Spätestens bei einem Duzend Applikationen steigt keiner mehr durch, welche Zugangsdaten zu welchem System gehören und entweder wird überall das Gleiche Passwort verwendet oder es werden in jedes System solange alle Passwörter eingegeben, bis man “drin” ist.

Authentifizierung für AppEngine Applikationen ist mit den google.appengine.api.users API ungemein einfach zu implementieren, wenn man verlangt, dass jeder Nutzer einen Google Account hat. Alternativ kann der, der “Google Apps for your domain” nutzt, gegen diese Accounts authentifizieren. Seit kurzer Zeit unterstützt AppEngine auch Federated Login mit OpenID. Dass dumme ist, dass man diese Optionen nicht so ohne weiteres zusammen nutzen kann. Oh, und wenn man “Google Apps for your domain” als Authentifizierung gewählt hat, gibt es keine Möglichkeit, das nachträglich zu ändern.

Authentifizierung gegen mehr als eine “Google Apps for your domain”

Wir arbeiten auf einigen unserer selbst entwickelten Applikationen zu mehr als einem Unternehmen zusammen. Deswegen wollen wir die Benutzer auch gegen verschiedene Google Apps Domains Authentifizieren - ohne unsere Applikation dauerhaft auf “Restricted to the Following Google Apps Domain” umzustellen.

Die Lösung hierfür ist OpenID. “Google Apps for your domain” kann als OpenID Provider dienen - wenn auch mit einigen Macken. Eine Google AppEngine Applikation kann ein OpenID “Consumer” sein und die zugehörigen Libraries unterstützen sogar die “seltsamme” OpenID Implementierung von Google Apps.

Wenn man für seine Applikation im AppEngine Dashboard unter “Application Settings” die “Authentication Options” auf “(Experimental) Federated Login” gestellt hat ist fast alles erledigt. Google kümmert sich um Session Coockies und dergleichen. google.appengine.api.users.get_current_user() liefert den aktuell eingeloggten user zurück. Wir müssen nur noch dafür sorgen, das User eingeloggt werden - und zwar nur von den “Google Apps for your domain” Domains, von denen unsere Nutzer kommen.

Dazu wird von der AppEngine erwartet, dass man unter der URL /_ah/login_required code laufen hat, der sich um den Login kümmert. Nicht eingeloggte user sollte man daher dahin umleiten. Das lässt sich mit Googles Webapp Framework z.B. in ein Mixin packen:

blog comments powered by Disqus