28 Stimmen

Fragen zur Verwendung Ihrer eigenen API mit OAuth

Ich erstelle eine RESTful API für ein Projekt, an dem ich arbeite, und ich möchte, dass die Hauptanwendung die API verbraucht, weil:

  1. Es wird nur einen Code-Satz zu pflegen geben
  2. Sollten wir uns entscheiden, die API für Entwickler von Drittanbietern freizugeben, wird dies bereits erledigt sein
  3. Es eröffnet die Möglichkeit, mobile Anwendungen zu entwickeln, die sie verbrauchen
  4. Ich möchte wirklich lernen, wie es geht

Die API wird auf einem Subdomain gehostet https://api.example.com und die Haupt-Webanwendung wird auf der Root-Domain gehostet https://example.com.

Konzeptionell verstehe ich, wie alles funktioniert, aber meine Hauptfrage ist, wie sich der Authentifizierungsfluss ändern wird, wenn überhaupt. Normalerweise würden Drittanbieter-Apps:

  1. Einen Anforderungstoken von https://api.example.com/request_token erhalten
  2. Den Benutzer zur Authentifizierung auf https://api.authenticate.com/authorize weiterleiten
  3. Zurück zur Drittanbieteranwendung weitergeleitet werden
  4. Einen Zugriffstoken von https://api.example.com/access_token erhalten

Da ich beide Domains kontrolliere, kann ich etwas Ähnliches tun wie:

  1. Einen Anforderungstoken erhalten, wenn der Benutzer auf der Login-Seite unter https://www.example.com landet
  2. Der Benutzer authentifiziert sich über ein Formular auf https://www.example.com, das den gleichen Code wie https://api.example.com/authorize aufruft
  3. Wenn die Anmeldedaten gültig sind, wird der Anforderungstoken gegen den Zugriffstoken ausgetauscht
  4. Der Zugriffstoken wird in der Sitzung gespeichert und läuft ab, wenn der Benutzer sich abmeldet, wie es normalerweise der Fall wäre

Schritt 3 fühlt sich falsch an, da es doppelten Code geben wird, aber würde mich das nicht Angriffen durch XSS öffnen, wenn das Anmeldeformular auf https://www.example.com die Daten an https://api.example.com sendet, da sie technisch verschiedene Domains sind?

Überkompliziere ich das Ganze?

20voto

Jon Nylander Punkte 8533

Ich bin auf dasselbe Problem gestoßen und habe es folgendermaßen gelöst.

1 Für Drittanbieter-Apps, die meine API verwenden, müssen sie sich bei allen Anfragen über OAuth authentifizieren.

2 Für meine eigenen Drittanbieter-Clients (mobile, AIR usw.) - verwenden sie OAuth, mit dem Unterschied, dass ich diesen erlaube, Benutzername und Passwort direkt im Autorisierungsschritt zu senden (damit ich einen nativen Anmeldedialog erstellen kann). Vorausgesetzt, Ihre API verwendet SSL/HTTPS.

3 Für meine Webanwendung verwende ich die Cookie-Authentifizierung, um auf die APIs zuzugreifen. Das bedeutet, dass der Benutzer nach dem Einloggen einfach API-URLs aufrufen und JSON/XML zurückbekommen kann. Perfekt zum schnellen Erkunden der APIs (obwohl eine echte API-Konsole wie APIGee dort eine bessere Arbeit leistet).

0voto

blockhead Punkte 9467

Ich würde sagen, dass du es ein wenig überkomplizierst. Wenn dein Code ordnungsgemäß getrennt ist, kannst du problemlos eine dünne REST-Schicht über die Service-Schicht deiner Anwendung erstellen, während deine Anwendungscontroller auch eine dünn Schicht über deiner Service-Schicht sind.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X