11

Mam 2 serwery w miejscu, jeden jest odpowiedzialny za front-end aplikacji i uwierzytelnianie użytkownika. Ten serwer renderuje pojedynczą aplikację strony kodowaną w javascript. Ta aplikacja javascript renderuje dane z drugiego serwera za pośrednictwem interfejsu API REST hostowanego na tym drugim serwerze.Jak zabezpieczyć interfejs API REST między aplikacją pojedynczej strony a serwerem?

Chciałbym zabezpieczyć ten drugi serwer. Chciałbym, aby tylko aplikacja frontendu mogła wywołać serwer zaplecza.

W tej chwili każdy może zadzwonić do reszty api z przeglądarki, aby wysłać zapytanie do danych.

Dzięki za pomoc.

+0

dlaczego muszą być na 2 różnych serwerach? czy używasz różnych języków? – mpm

+0

Nie, ten sam język jest używany na obu serwerach. Umieściłem resztę api na jednym serwerze i interfejsie na innym serwerze ze względu na skalowalność i rozłączenie problemów. – Michael

Odpowiedz

11

Wszystko, co aplikacja javascript może zrobić w kliencie przeglądarki, może zobaczyć i zrobić ktoś inny, aby uzyskać dostęp do serwera API REST zaplecza poza aplikacją.

Fakt, że aplikacja kliencka jest zaimplementowana w języku JavaScript jest nieistotny - nie można w pełni zaufać aplikacji uruchamianej na komputerze znajdującym się poza kontrolą użytkownika. Trochę trudniej jest odtworzyć kod natywny możliwy do wykrycia niż do ViewSource w aplikacji javascript, ale nie jest to niemożliwe. Nigdy nie polegaj na bezpieczeństwie przez zaciemnienie.

Najlepszym rozwiązaniem jest, aby aplikacja przeglądarki wymagała od użytkownika końcowego zalogowania się i uzyskania tokena autoryzacji od zaufanego dostawcy tożsamości oraz przedstawienia tokena autoryzacji w każdym żądaniu aplikacji przeglądarki do interfejsu API REST. Interfejs REST API może następnie zweryfikować token uwierzytelniania, aby sprawdzić, czy pochodzi on od zaufanego dostawcy oraz czy użytkownik wskazany w tokenie jest uprawniony do korzystania z interfejsu API REST.

Wiąże to autoryzację wywołań REST API z użytkownikiem zamiast z aplikacją i korzysta z sekretów (poświadczeń użytkownika), które nie znajdują się w aplikacji przeglądarki dla całego świata.

Dzięki temu można ograniczyć dostęp do interfejsu API REST w zależności od tego, który użytkownik nawiązuje połączenie. Nadal możesz także filtrować dostęp w zależności od aplikacji, która je wysyła, ale nie powinna to być główny czynnik bezpieczeństwa, ponieważ łatwiej jest skopiować opis aplikacji niż poświadczenia użytkownika.

Inną opcją może być, aby serwer WWW działał jako serwer proxy dla usługi REST API, tak aby aplikacja przeglądarki musiała przechodzić przez serwer sieci Web, aby pobierać dane z interfejsu API REST. Może to być możliwe, jeśli aplikacja przeglądarka utrzymuje stan sesji, który serwer sieciowy może zweryfikować, aby ustalić, że żądanie pochodzi z aplikacji bona-fide, a nie od kogoś innego. Chociaż może to pozwolić na wyłączenie interfejsu REST API z sieci publicznej, tak naprawdę nie zmienia to Twojego problemu z autoryzacją - właśnie przeniosłeś go na serwer internetowy, na którym możesz mieć więcej kontekstu sesji, aby odróżnić żądanie w aplikacji od żądanie międzyoperatorskie. Tenuous w najlepszym razie, niezalecane, chyba że jesteś naprawdę pewien stanu sesji aplikacji.

Bez względu na to, jakie rozwiązanie wybierzesz, faktem jest, że jeśli Twój REST API jest dostępny z aplikacji klienckiej (przeglądarki lub w inny sposób), jest to publiczny interfejs REST API i powinien być traktowany (i wzmacniany) jako taki. Nie ma czegoś takiego jak prywatny web API, do którego można uzyskać dostęp z komputera klienta.

+0

dzięki za odpowiedź. Podoba mi się twój pomysł posiadania zaufanego tokena uwierzytelnionego otrzymanego od zaufanego dostawcy. To, co wyjaśniasz, to w zasadzie mechanizm OAuth? Wyobraźmy sobie, że użytkownik uwierzytelnia się w mojej aplikacji przez Google lub dowolnego zaufanego dostawcę.Czy dostają one w zamian opłatę i czy mogę użyć tego tocken do podpisania któregokolwiek z moich wywołań API. – Michael

+0

Tak, OAuth jest takim systemem tokenów. Tak samo SAML. Tak, możesz użyć tokenów wydanych przez Google i inne osoby do uwierzytelnienia osoby dzwoniącej Twojego API. Twój interfejs API będzie musiał zweryfikować token (sprawdź podpis względem znanych certyfikatów lub operatora połączenia). Google udostępnia interfejsy API, aby to zrobić w swoim systemie, aby nie musieć wdawać się w brudne szczegóły protokołu i formatów pakietów. – dthorpe

+1

Należy pamiętać, że Google i inni dostawcy tożsamości zapewniają jedynie uwierzytelnianie użytkownika. Twój interfejs API może ufać, że tożsamość dzwoniącego jest autentyczna, ale sam musisz sam zdecydować o autoryzacji. Istnieją w pełni funkcjonalne systemy bezpiecznego tokena (STS), które zapewniają tożsamość i rolę/uprawnienia/informacje o uprawnieniach. Google, FB, itp. Zapewniają tylko tożsamość. – dthorpe

Powiązane problemy