Interne und externe API-Architektur


19

Das Unternehmen, für das ich arbeite, unterhält ein erfolgreiches SaaS-Produkt, das im Laufe der Jahre "organisch" gewachsen ist. Wir planen, die Produktreihe um eine Reihe neuer Produkte zu erweitern, die Daten mit dem vorhandenen Produkt teilen. Um dies zu unterstützen, möchten wir die Geschäftslogik an einem einzigen Ort konsolidieren: einer Webserviceschicht. Die WS-Schicht wird verwendet von:

  • Die Webanwendungen
  • Ein Tool zum Importieren von Daten
  • Ein Tool zur Integration in andere Client-Software (keine API per se)

Wir möchten auch eine API erstellen, die von unseren Kunden verwendet werden kann und die in der Lage ist, eigene Integrationen zu erstellen. Wir haben mit der folgenden Frage zu kämpfen:

Sollte die interne API (auch als WS-Schicht bezeichnet) und die externe API identisch sein, mit Sicherheits- und Berechtigungseinstellungen, um zu steuern, was von wem getan werden kann, oder sollten es zwei separate Anwendungen sein, bei denen die externe API nur die interne API aufruft wie jede andere Anwendung? Bisher scheint es in unserer Debatte sicherer zu sein, sie zu trennen, aber das wird den Aufwand erhöhen.

Was haben andere in einer ähnlichen Situation getan?


Wenn Sie ein nettes Framework für SOA kaufen, ist all diese Debatte umstritten. Planen Sie, ein eigenes SOA-Framework zu implementieren? Warum? Wenn es ein erfolgreiches Produkt ist, warum nicht JCAPS von Oracle lizenzieren? Oder WebSphere von IBM? Dann wird die Sicherheit der WS-Schicht allgegenwärtig und transparent.
S.Lott

1
@ S.lott Es ist wirklich nicht so schwer eine SOA-Ebene zu schreiben. Keine dieser Plattformen basiert auf REST. das ist 2012, nicht wahr? Diese klingen schrecklich "unternehmungslustig".
Evan Plaice

Warum nicht eine Service-Schicht über Ihrem Domain-Modell haben, dann können Sie dieselben Services intern mit Ihrem Quellcode verwenden.
M.abuelezz

Antworten:


13

Es ist immer gut, sein eigenes Hundefutter zu essen. Eine API sollte auch einfacher zu warten sein als zwei, selbst wenn Sie einen gewissen Aufwand für die Authentifizierung und Autorisierung einkalkulieren.


4
Ich mag die Art und Weise, wie Sie das sagen. Zwei getrennte Ebenen zu haben, wird letztendlich bedeuten, dass die Dinge in Zukunft oft an zwei Orten geändert werden, zusätzliche Tests und viel allgemeiner Wahnsinn, um herauszufinden, warum die Dinge nicht mehr synchron sind. Wenn ich genug Ruf hätte, um Ihre Antwort zu stimmen, würde ich :)
Drew Goodwin

5

Obwohl ich mit Aneurysm9 einverstanden bin, möchten Sie manchmal nicht alle Funktionen Ihres Systems offenlegen. In diesem Fall sind zwei APIs vorzuziehen ... ABER wenn Sie dies so gewählt haben ... stellen Sie sicher, dass alle gängigen Funktionen dieselbe API verwenden, dh dass eine erweiterte Version der anderen ist und nicht zwei unterschiedliche Sätze von Code.

Auf diese Weise können Sie Ihre eigenen verwenden, während Sie einen Platz für private, sensible, experimentelle Arbeiten haben, während Sie weiterhin die Möglichkeit haben, die neuen Inhalte zu veröffentlichen und zu verwenden, ohne die öffentliche API zu stark zu ändern.


3
Ich denke, wir sind uns hier einig. Verwenden Sie die Sicherheitsschicht, um die Obermenge der Funktionen auf interne Benutzer zu beschränken. Auf diese Weise haben Sie eine API, aber mehrere Berechtigungsstufen, um auf die API zuzugreifen.
Aneurysm9

Ich denke darüber nach, dies selbst zu tun und damit umzugehen, indem ich meine App zu einem Benutzer mit erhöhten Rechten mache. Es ist schwierig, mein Gehirn herumzuwickeln. Ich denke, ich muss Hammock Driven Development auf diese anwenden .
AJB

4

Das habe ich (schon oft) erlebt und am Ende habe ich Folgendes bevorzugt:

Nehmen Sie die BL aus der Website. Machen Sie die Website zu einem Verbraucher der API. Behandeln Sie die Website wie einen anderen Client Ihrer API. Ihre API ist der Dienst.

Wenn Sie der Meinung sind, dass Sie spezielle API-Methoden nur für die Website benötigen, überlegen Sie es sich noch einmal! Wenn es gut für die Gans ist, ist es gut für den Betrachter. Wenn Sie wirklich, wirklich, wirklich spezielle Funktionen für die Website benötigen, würde ich vorschlagen, dass Sie tatsächlich einen Unterschied im "Benutzerprofil" festgestellt haben. Daher sollte die API die "speziellen" Funktionen weiterhin unterstützen, aber Sie steuern sie über die Autorisierung.

Nicht überzeugt?

Nehmen Sie das Paradigma einen Schritt weiter ...

Die Telefon-App wird auf einer Plattform ausgeführt, auf der Bytecode ausgeführt wird, die App im Telefon gespeichert ist und API-Dienste über HTTP / JSON verwendet

Die Website ist eine App, die auf einer Plattform ausgeführt wird, auf der HTML + Javascript ausgeführt wird, die App im Browser ausgeführt wird und API-Dienste über HTTP / JSON verwendet

Gleich!

Erweitern Sie das auf Tablets, Fernseher, andere Telefonplattformen, Plugins, Apps von Drittanbietern, Mashups, ...

Viele verschiedene Benutzererfahrungen sind alle mit einer gemeinsamen API verbunden.

Ihre App ist die API. Die Website ist nur ein Kunde (von vielen)


Begreifen , dass die API ist die gesamte Anwendungsschicht und die verschiedenen Versionen (OS, Browser, Tablet, Telefon) sind nur Kunden der API hat mich an die A-Ha! Moment gerade jetzt.
AJB

2

Verwenden Sie eine API

Wenn Sie die Service-API als REST-Schicht implementieren, fügen Sie den geschützten Routen lediglich eine Authentifizierung hinzu.

Sie werden wahrscheinlich ein Entwicklungsframework verwenden wollen, das nicht zu viel "Magie" enthält. Etwas, bei dem Sie Routen ohne viel Reverse Engineering direkt definieren können.

Denken Sie an etwas wie Node.js / Express, Python / Pylons, Python / Google App Engine usw.

Ich habe dies kürzlich in Google App Engine für eine REST / Datastore-API implementiert und glaube nicht, dass es einfacher hätte sein können. Controller werden als Klassen implementiert, und ihre nachfolgenden HTTP-Anforderungen (dh GET / POST / PUT / DELETE) werden als Methoden dieser Klassen implementiert. Ich habe es geschafft, basic-auth als Dekorateur zu implementieren. Dies machte das Hinzufügen einer Authentifizierungsanforderung zu einer Anfrage so einfach wie das Anhängen des @ basicAuth-Dekorators.

Auf diese Weise könnte ich eingehende GET-Anforderungen öffentlich machen und POST / PUT / DELETE-Anforderungen auf demselben Controller für dieses Modell eine Authentifizierungsanforderung hinzufügen.

Wenn Sie wissen, wie man in REST spricht, wird das Leben viel einfacher, da die REST-Unterstützung bereits in einen Webserver integriert ist (dh HTTP ist nur eine Art REST-API). Sie können sich sogar für eine transparente gzip-Komprimierung entscheiden, wenn Sie viele Daten über die Leitung senden.


-1

Mein erster Eindruck ist, dass es sich um dieselbe API handeln sollte und dass sich Ihre Sicherheit insgesamt auf einer anderen Ebene befinden sollte. Vielleicht von einer Webfront gehandhabt?


2
Manchmal gehen Sicherheitsbedenken weit über die bloße Verschlüsselung und Signatur von Transaktionen hinaus. Daher ist es durchaus möglich, dass einige oder sogar viele sicherheitsrelevante Elemente in Ihrer Haupt-API vorkommen. Trotzdem stimme ich Ihnen zu, wenn ich versuche, es so getrennt wie möglich zu halten.
Newtopian
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.