Frage

Ich bin Aufbau Pylonen-basierte Web-Anwendung mit RESTful API, die derzeit jede Authentifizierung fehlt. Also werde ich, dass und implementieren, um alle die Mühe und Vorsicht zu vermeiden, mit Benutzer-Passwörter zu speichern, würde ich OpenID wie für die Authentifizierung verwenden. Was wäre der beste Weg, dies zu tun? Sind diese beiden Dinge miteinander vereinbar? Gibt es bestehende REST-APIs, die OpenID verwenden, die ich Inspiration nehmen kann?

War es hilfreich?

Lösung

Ich habe jetzt einige Zeit forschen die Optionen ausgegeben und möchten die Ergebnisse zusammenzufassen. Zuerst wird ein bisschen mehr Kontext - ich entwickeln und steuern sowohl den Service und die API Verbraucher. Verbraucher Flash-basierte Anwendung, die aus dem gleichen Host bedient wird, die API jetzt ist, und sollte im Browser verwendet werden. Keine Drittkunden in Sicht noch.

Die Frage kann in zwei Teile aufgeteilt werden,

  • Wie kann ich tun, um die OpenID Authentifizierung über API
  • Wie pflege ich die „authentifiziert“ Zustand in nachfolgenden Anforderungen

Für ersten Teil, OpenID Authentifizierung fast immer auch interaktive Schritte. Während des Authentifizierungsprozesses wird es höchstwahrscheinlich ein Schritt sein, in dem Benutzer in dem Web-Seite OpenID-Provider ist, die Anmeldung bei und drückt etwas „Ich stimme zu“ klicken. So API kann und soll diese transparent nicht verarbeiten (keine „sagen Sie mir Ihre OpenID-Provider und Passwort, und ich werde den Rest“). Beste es tun kann, ist, passieren hin und zurück HTTP-Links, die Client zu öffnen hat und folgen Sie den Anweisungen.

Verwalten "authentifiziert" state

REST-APIs staatenlos sein sollte, sollte jede Anforderung enthalten alle erforderlichen Informationen, um es zu behandeln, nicht wahr? Es würde keinen Sinn gegen OpenID-Provider für jede Anforderung zu authentifizieren machen, so einig Art der Sitzung ist notwendig. Einige der Optionen für die Kommunikation Sitzungsschlüssel (oder „Zugriffstoken“ oder Benutzername / Passwort) sind:

  • HTTPS + BASIC-Authentifizierung ( "Authorization: Basic ..." Header in jeder Anfrage)
  • Signierungsanforderungen Amazon-Stil ( "Authorization: AWS ..." Header in jeder Anfrage)
  • OAuth: erwerben Zugriffstoken, umfasst das und noch eine Reihe anderer Parameter in jeder Anforderung
  • Cookie, die Sitzungsschlüssel speichert ( "Cookie: ..." Header in jeder Anfrage)
  • Signed Cookie, Session-Informationen in dem Cookie speichert selbst

Es gibt nur eine API Verbraucher gerade jetzt, so wählte ich für einfachste Sache zu gehen, die möglicherweise funktionieren könnten - Cookies. Sie sind super-einfach in Pylons zu bedienen, mit Hilfe von Beaker . Sie „einfach funktionieren“ in dem Flash-App auch - da es im Inneren Browser ausgeführt wird, wird Browser Cookies unterrichtet in den Anforderungen enthalten, die Flash-App macht - die App überhaupt nicht in Bezug auf das geändert werden muss. Hier ist eine Stackoverflow Frage, befürwortet auch die Verwendung von Cookies: RESTful Authentifizierung für Web-Anwendungen

Beaker hat auch nette Eigenschaft von Cookie-only-Sitzungen wo alle Sitzungsdaten im Cookie selbst enthalten. Ich denke, das etwa als staatenlos ist, wie es erhält. Es ist nicht Session-Speicher auf dem Server. Cookies sind signiert und optional mit ihnen in Client-Seite um Manipulationen zu vermeiden verschlüsselt. Der Nachteil ist, dass Cookie wird ein bisschen größer, da es nun mehr speichern als nur Sitzungsschlüssel benötigt. Durch ein paar Sachen zu entfernen brauchte ich nicht wirklich in der Sitzung (Reste von OpenID-Authentifizierung) ich die Keksgröße bekam bis auf etwa 200 Byte.

Andere Tipps

OAuth ist eine bessere Passform für API-Nutzung. Hier ist ein Beispiel von OAuth im Einsatz in Python: oauth-python-twitter . Leah Culver python-oauth Bibliothek die kanonische Implementierung von OAuth in Python, aber python-oauth2 ist ein kürzlicher Anwärter, die ein gewisse Summe erhalten. Wie für die Inspiration, django-Kolben Unterstützung für die Verwendung von OAuth zu tun hat, wenn Auth RESTful APIs für Django erstellen, wenn die Dokumentation nicht so schön ist, wie ich für das jeweilige Thema wissen möchte.

Wenn Sie API bauen, könnten Sie OAuth-Protokoll überprüfen. Es ist komplementär zu OpenID.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top