Wewnętrzna i zewnętrzna architektura API

19

Firma, dla której pracuję, utrzymuje udany produkt SaaS, który z biegiem lat rozwijał się „organicznie”. Planujemy rozszerzyć linię o pakiet nowych produktów, które będą dzielić dane z istniejącym produktem. Aby to wesprzeć, chcemy skonsolidować logikę biznesową w jednym miejscu: warstwie usług internetowych. Warstwa WS będzie używana przez:

  • Aplikacje internetowe
  • Narzędzie do importowania danych
  • Narzędzie do integracji z innym oprogramowaniem klienckim (nie API jako takim)

Chcemy również stworzyć interfejs API, który może być używany przez naszych klientów, którzy mogą go używać do tworzenia własnych integracji. Zmagamy się z następującym pytaniem:

Czy wewnętrzny interfejs API (zwany również warstwą WS) i zewnętrzny interfejs API powinny być takie same, z ustawieniami zabezpieczeń i uprawnień do kontrolowania tego, co może zrobić osoba, lub powinny to być dwie oddzielne aplikacje, w których zewnętrzny interfejs API po prostu wywołuje wewnętrzny interfejs API jak każda inna aplikacja? Jak dotąd w naszej debacie wydaje się, że ich rozdzielenie może być bezpieczniejsze, ale spowoduje dodatkowe obciążenie.

Co zrobili inni w podobnej sytuacji?

Drew Goodwin
źródło
Jeśli kupisz fajne ramy dla SOA, cała ta debata jest dyskusyjna. Czy planujesz wprowadzić własną strukturę SOA? Dlaczego? Jeśli jest to udany produkt, dlaczego nie licencjonować JCAPS od Oracle? Lub WebSphere z IBM? Wtedy bezpieczeństwo warstwy WS staje się wszechobecne i przejrzyste.
S.Lott
1
@ S.Lott Pisanie warstwy SOA nie jest wcale takie trudne. Żadna z tych platform nie jest oparta na REST; to jest 2012 prawda? Brzmią okropnie „przedsiębiorczo”.
Evan Plaice,
Dlaczego nie mieć warstwy usług u góry modelu domeny, możesz korzystać z tych samych usług wewnętrznie z kodem źródłowym.
M.abuelezz

Odpowiedzi:

13

Zawsze dobrze jest jeść własne psie pożywienie. Jeden interfejs API powinien być również prostszy w utrzymaniu niż dwa, nawet jeśli weźmiesz pod uwagę pewne koszty ogólne związane z uwierzytelnianiem i autoryzacją.

Tętniak 9
źródło
4
Podoba mi się sposób, w jaki to ujmujesz. Posiadanie dwóch oddzielnych warstw będzie ostatecznie oznaczało zmianę rzeczy w dwóch miejscach wiele razy w przyszłości, dodatkowe testy i wiele ogólnych szaleństw, próbujących dowiedzieć się, dlaczego rzeczy się nie zsynchronizowały. Gdybym miał wystarczająco dużo reputacji głosu w górę swoją odpowiedź, chciałbym :)
Drew Goodwin
5

Chociaż zgadzam się z Aneurysm9, czasami nie chcesz ujawniać wszystkich możliwości swojego systemu. W takim przypadku preferowane byłoby posiadanie dwóch interfejsów API ... ALE jeśli to zrobisz, wybierz ten sposób ... upewnij się, że wszystkie typowe funkcje współużytkują ten sam interfejs API, tj. Jeden z nich jest rozszerzoną wersją drugiego, a nie dwoma odrębnymi zestawy kodu.

W ten sposób możesz używać własnego dla siebie, mając jednocześnie miejsce na prywatne, wrażliwe, eksperymentalne prace, jednocześnie umożliwiając publikowanie i używanie nowych rzeczy bez zbytniej zmiany publicznego interfejsu API.

Newtopian
źródło
3
Myślę, że tutaj się zgadzamy. Użyj warstwy bezpieczeństwa, aby ograniczyć nadzór funkcjonalności do użytkowników wewnętrznych. W ten sposób masz jeden interfejs API, ale wiele poziomów uprawnień dostępu do interfejsu API.
Aneurysm9
Zastanawiam się nad zrobieniem tego samemu i obsługą tego, czyniąc moją aplikację samodzielną z podwyższonymi uprawnieniami. Chytry, żeby owinąć mój mózg. Myślę, że muszę zastosować w tym przypadku Hammock Driven Development .
AJB
4

Zetknąłem się z tym wcześniej (wiele razy) i wolałem:

Wyjmij BL ze strony internetowej. Ustaw witrynę jako konsumenta interfejsu API. Traktuj witrynę jak zwykłego klienta API. Twój interfejs API to usługa.

Jeśli uważasz, że potrzebujesz specjalnych metod API tylko dla witryny, pomyśl jeszcze raz! Jeśli jest dobry dla gęsi, jest dobry dla wędrowca. Jeśli naprawdę naprawdę potrzebujesz specjalnej funkcjonalności dla witryny, sugerowałbym, że to, co naprawdę znalazłeś, stanowi różnicę w „profilu użytkownika” i dlatego jest to sytuacja, w której API powinien nadal obsługiwać „specjalne” funkcje, ale wtedy kontrolować je poprzez autoryzację.

Nieprzekonany?

Zrób paradygmat o krok dalej ...

Aplikacja na telefon działa na platformie, na której wykonywany jest kod bajtowy, aplikacja mieszka w telefonie i zużywa usługi API przez HTTP / JSON

Witryna to aplikacja działająca na platformie, na której wykonywany jest HTML + JavaScript, aplikacja działa w przeglądarce i korzysta z usług API przez HTTP / JSON

Takie samo!

Rozszerz to na tablety, telewizory, inne platformy telefoniczne, wtyczki, aplikacje innych firm, mashupy, ...

Wiele różnych doświadczeń użytkownika podłączonych do wspólnego API.

Twoja aplikacja jest interfejsem API. Witryna jest tylko jednym klientem (spośród wielu)

Jason Glover
źródło
Zrozumienie, że API jest całą warstwą aplikacji, a różne wersje (system operacyjny, przeglądarka, tablet, telefon) są tylko klientami API, doprowadziły mnie do A-Ha! chwila właśnie teraz.
AJB
2

Użyj jednego interfejsu API

Jeśli implementujesz interfejs API usługi jako warstwę REST, po prostu dodaj uwierzytelnianie do chronionych tras.

Prawdopodobnie zechcesz użyć frameworka programistycznego, który nie upiecze zbyt wiele „magii”. Coś, w którym możesz bezpośrednio definiować trasy bez całej rekonstrukcji.

Pomyśl coś takiego jak Node.js / Express, python / pylons, silnik aplikacji python / google itp.

Niedawno zaimplementowałem to w Google App Engine dla interfejsu API REST / Datastore i nie sądzę, żeby mogło być łatwiej. Kontrolery są implementowane jako klasy, a ich kolejne żądania HTTP (tj. GET / POST / PUT / DELETE) są implementowane jako metody tych klas. Udało mi się zaimplementować basic-auth jako dekorator. To spowodowało, że dodanie wymogu uwierzytelnienia do żądania było tak proste, jak dołączenie dekoratora @basicAuth.

W ten sposób mogłem upublicznić przychodzące żądania GET, dodając wymóg uwierzytelnienia do żądań POST / PUT / DELETE na tym samym kontrolerze dla tego modelu.

Jeśli wiesz, jak mówić w REST, życie staje się o wiele łatwiejsze, ponieważ obsługa REST jest już nieodłącznie zapisana w dowolnym serwerze internetowym (tj. HTTP jest tylko rodzajem interfejsu API REST). Możesz nawet wybrać przezroczystą kompresję gzip, jeśli wysyłasz dużo danych przez drut.

Evan Plaice
źródło
-1

Moje pierwsze wrażenie jest takie, że powinien to być ten sam interfejs API i że twoje zabezpieczenia powinny znajdować się na innej warstwie. Może obsługiwany przez front internetowy?

wegetarianin
źródło
2
Czasami obawy dotyczące bezpieczeństwa wykopują się znacznie głębiej niż zwykłe szyfrowanie i podpisywanie transakcji. Jako takie jest całkiem możliwe, że niektóre, a nawet wiele elementów zorientowanych na bezpieczeństwo wkrada się do głównego interfejsu API. To powiedziawszy, zgodziłbym się z wami, aby starać się zachować możliwie jak najbardziej osobny rozdział.
Newtopian