Dzięki nowej funkcji chmury Firebase postanowiłem przenieść część mojego punktu końcowego HTTP do Firebase. Wszystko działa świetnie ... Ale mam następujący problem. Mam dwa punkty końcowe zbudowane przez wyzwalacze HTTP (funkcje w chmurze)
- Punkt końcowy interfejsu API służący do tworzenia użytkowników i zwracania niestandardowego tokenu wygenerowanego przez pakiet Firebase Admin SDK.
- Punkt końcowy interfejsu API do pobierania określonych danych użytkownika.
Chociaż pierwszy punkt końcowy jest w porządku, ale dla mojego drugiego punktu końcowego chciałbym go chronić tylko dla uwierzytelnionych użytkowników. czyli ktoś, kto ma wygenerowany przeze mnie token.
Jak mam rozwiązać ten problem?
Wiem, że możemy uzyskać parametry nagłówka w funkcji chmury za pomocą
request.get('x-myheader')
ale czy istnieje sposób ochrony punktu końcowego tak samo, jak ochrona bazy danych czasu rzeczywistego?
firebase
firebase-realtime-database
firebase-authentication
firebase-security
google-cloud-functions
spaceMonkey
źródło
źródło
Odpowiedzi:
Istnieje oficjalny przykład kodu dla tego, co próbujesz zrobić. Pokazuje, jak skonfigurować funkcję HTTPS tak, aby wymagała nagłówka Authorization z tokenem, który klient otrzymał podczas uwierzytelniania. Funkcja korzysta z biblioteki firebase-admin do weryfikacji tokenu.
Możesz też użyć „ funkcji wywoływalnych ”, aby ułatwić sobie wiele z tego standardowego schematu, jeśli Twoja aplikacja może korzystać z bibliotek klienta Firebase.
źródło
Jak wspomniał @Doug, możesz użyć
firebase-admin
do weryfikacji tokena. Ustawiłem szybki przykład:W powyższym przykładzie włączyłem również CORS, ale jest to opcjonalne. Najpierw zdobądź
Authorization
nagłówek i dowiesz się, żetoken
.Następnie możesz użyć
firebase-admin
do zweryfikowania tego tokena. W odpowiedzi otrzymasz zdekodowane informacje dla tego użytkownika. W przeciwnym razie, jeśli token jest nieprawidłowy, zgłosi błąd.źródło
getIdToken()
metody po stronie klienta (np.firebase.auth().currentUser.getIdToken().then(token => console.log(token))
) W dokumentach firebaseJak również wspomniał @Doug, możesz użyć funkcji Callable Functions , aby wykluczyć jakiś standardowy kod z klienta i serwera.
Przykładowa funkcja wywoływana:
Można go wywołać bezpośrednio z klienta, na przykład:
źródło
Powyższe metody uwierzytelniają użytkownika przy użyciu logiki wewnątrz funkcji, więc funkcja musi być nadal wywoływana w celu sprawdzenia.
To całkiem dobra metoda, ale ze względu na kompleksowość istnieje alternatywa:
Możesz ustawić funkcję jako „prywatną”, aby nie mogła być wywoływana z wyjątkiem zarejestrowanych użytkowników (Ty decydujesz o uprawnieniach). W takim przypadku nieuwierzytelnione żądania są odrzucane poza kontekstem funkcji, a funkcja nie jest w ogóle wywoływana.
Oto odniesienia do (a) Konfigurowania funkcji jako publicznych / prywatnych , a następnie (b) uwierzytelniania użytkowników końcowych w Twoich funkcjach .
Pamiętaj, że powyższe dokumenty dotyczą Google Cloud Platform i rzeczywiście to działa, ponieważ każdy projekt Firebase jest również projektem GCP. Powiązanym zastrzeżeniem z tą metodą jest to, że w chwili pisania działa ona tylko z uwierzytelnianiem opartym na koncie Google.
źródło
Jest na to fajny oficjalny przykład użycia Express - może się przydać w przyszłości: https://github.com/firebase/functions-samples/blob/master/authorized-https-endpoint/functions/index.js (wklejam poniżej tylko na pewno)
Pamiętaj,
exports.app
że twoje funkcje są dostępne pod/app
slugiem (w tym przypadku jest tylko jedna funkcja i jest dostępna pod<you-firebase-app>/app/hello
. Aby się jej pozbyć, musisz trochę przepisać część Express (część oprogramowania pośredniego do walidacji pozostaje taka sama - działa bardzo dobre i dzięki komentarzom jest całkiem zrozumiałe).Mój przepis, aby pozbyć się
/app
:źródło
Starałem się uzyskać prawidłowe uwierzytelnienie Firebase w funkcji golang GCP. Właściwie nie ma na to przykładu, więc postanowiłem zbudować tę malutką bibliotekę: https://github.com/Jblew/go-firebase-auth-in-gcp-functions
Teraz możesz łatwo uwierzytelniać użytkowników za pomocą firebase-auth (który różni się od funkcji uwierzytelnionych przez gcp i nie jest bezpośrednio obsługiwany przez proxy rozpoznające tożsamość).
Oto przykład użycia narzędzia:
import ( firebaseGcpAuth "github.com/Jblew/go-firebase-auth-in-gcp-functions" auth "firebase.google.com/go/auth" ) func SomeGCPHttpCloudFunction(w http.ResponseWriter, req *http.Request) error { // You need to provide 1. Context, 2. request, 3. firebase auth client var client *auth.Client firebaseUser, err := firebaseGcpAuth.AuthenticateFirebaseUser(context.Background(), req, authClient) if err != nil { return err // Error if not authenticated or bearer token invalid } // Returned value: *auth.UserRecord }
Po prostu pamiętaj, aby wdrożyć funkcję z
--allow-unauthenticated
flagą (ponieważ uwierzytelnianie Firebase odbywa się wewnątrz wykonywania funkcji).Mam nadzieję, że to ci pomoże, tak jak mi pomogło. Byłem zdecydowany używać golanga do funkcji chmury ze względów wydajnościowych - Jędrzej
źródło
W Firebase, aby uprościć kod i pracę, wystarczy zaprojektować architekturę :
Express
. Aby ograniczyć tylko tę samą lub określoną witrynę , użyjCORS
do kontrolowania tego aspektu bezpieczeństwa. Ma to sens, ponieważExpress
jest przydatne dla SEO ze względu na treść renderowaną po stronie serwera.context
wywołania HTTPS , a następnie użyj parametru, aby zapisać wszystkie kłopoty. Ma to również sens, ponieważ na przykład aplikacja jednostronicowa zbudowana za pomocą AngularJS - AngularJS jest szkodliwa dla SEO, ale ponieważ jest to aplikacja chroniona hasłem, nie potrzebujesz też dużo SEO. Jeśli chodzi o tworzenie szablonów, AngularJS ma wbudowane szablony, więc nie ma potrzeby stosowania szablonu po stronie serwera zExpress
. Wtedy funkcje wywoływalne Firebase powinny być wystarczająco dobre.Mając to na uwadze, koniec z kłopotami i ułatwienie życia.
źródło