Zmniejsz ryzyko, wdrażając uwierzytelnianie HttpOnly cookie w Amazon API Gateway
Niektóre aplikacje internetowe muszą chronić swoje tokeny uwierzytelniania lub identyfikatory sesji przed skryptami krzyżowymi (XSS). Jest to najlepsza praktyka Open Web Application Security Project (OWASP) w zakresie zarządzania sesją polegająca na przechowywaniu tajnych informacji w magazynie plików cookie przeglądarek z włączonym atrybutem HttpOnly. Gdy pliki cookie mają ustawiony atrybut HttpOnly, przeglądarka uniemożliwi kodowi JavaScript po stronie klienta dostęp do tej wartości. W ten sposób zmniejsza to ryzyko ujawnienia tajnych danych.
Dzięki poniższemu artykułowi otrzymasz dawkę wiedzy na temat tego, jak przechowywać tokeny dostępu i uwierzytelniać za pomocą plików cookie HttpOnly we własnych obciążeniach w momencie, gdy używasz Amazon API Gateway jako punktu końcowego, nakierowanego na klienta. Tutorial zawarty w tym artykule przedstawi rozwiązanie do przechowywania tokenów dostępu OAuth2 w sklepie cookie przeglądarki i weryfikacji uwierzytelniania użytkownika przez Amazon API Gateway. W tym tekście opisano, w jaki sposób używać Amazon Cognito do wydawania tokenów dostępu OAuth2, ale rozwiązanie nie ogranicza się tylko do OAuth2. Możesz użyć innych rodzajów tokenów lub identyfikatorów sesji.
Rozwiązanie składa się z dwóch niezależnych części:
- OAuth2 flow
- Authentication check
Uwaga: Poniższy tutorial zawiera szczegółowe instrukcje krok po kroku dotyczące wdrażania przykładowego rozwiązania. Jeśli wolisz wdrożyć rozwiązanie za pomocą skryptu, zobacz api-gw-http-only-cookie-auth w repozytorium GitHub.
Warunki wstępne
- Powinieneś posiadać konto AWS.
- Powinieneś posiadać wiedzę na poziomie 200-300 na temat protokołu OAuth2.
- Powinieneś mieć zainstalowany interfejs wiersza poleceń AWS (AWS CLI).
- Powinieneś mieć zainstalowany AWS Toolkit for Visual Studio Code, abyś mógł w prosty sposób przesłać swój kod.
- Powinieneś mieć zainstalowany Node.js na komputerze lokalnym.
- To rozwiązanie korzysta z następujących usług:
Wdrożenie aplikacji z tego samouczka nie powinno wiązać się z żadnymi kosztami, ponieważ usługi, z których zamierzasz korzystać, są zawarte w bezpłatnym poziomie AWS. Należy jednak pamiętać, że mogą obowiązywać niewielkie opłaty, jeśli na koncie AWS działają inne obciążenia, które przekraczają bezpłatny poziom. Pamiętaj, aby usunąć zasoby z tego tutorialu po wdrożeniu.
Architektura rozwiązania
To rozwiązanie wykorzystuje Amazon Cognito, Amazon API Gateway i AWS Lambda do zbudowania odpowiedzi, która utrzymuje tokeny dostępu OAuth2 w magazynie plików cookie przeglądarki. Rysunek nr 1 ilustruje architekturę rozwiązania dla przepływu OAuth2.
- Użytkownik uwierzytelnia się za pomocą Amazon Cognito.
- Amazon Cognito ma identyfikator URI przekierowania OAuth2 wskazujący punkt końcowy bramy interfejsu API i wywołuje zintegrowaną funkcję Lambda oAuth2Callback.
- Funkcja oAuth2Callback Lambda wysyła żądanie do punktu końcowego tokena Amazon Cognito z kodem autoryzacyjnym OAuth2 w celu uzyskania tokena dostępu.
- Funkcja Lambda zwraca odpowiedź z nagłówkiem Set-Cookie, instruując przeglądarkę internetową, aby utrwaliła token dostępu jako plik cookie HttpOnly. Przeglądarka automatycznie zinterpretuje nagłówek Set-Cookie, ponieważ jest to standard sieciowy. Dostęp do plików cookie HttpOnly nie jest możliwy za pośrednictwem JavaScript — można je ustawić tylko za pomocą nagłówka Set-Cookie.
Po przepływie OAuth2 jesteś skonfigurowany do wydawania i przechowywania tokenów dostępu. Następnie musisz zweryfikować, czy użytkownicy są uwierzytelnieni, zanim uzyskają dostęp do chronionego zaplecza. Rysunek nr 2 obrazuje sposób obsługi sprawdzania uwierzytelnienia.
- Użytkownik żąda chronionego zasobu zaplecza.Przeglądarka automatycznie dołącza pliki cookie HttpOnly do każdego żądania, zgodnie z definicją w standardzie sieciowym.
- Funkcja Lambda oAuth2Authorizer działa jako autoryzacja Lambda dla API HTTP.Sprawdza, czy żądania są uwierzytelnione.Jeśli żądania zawierają odpowiedni token dostępu w nagłówku pliku cookie żądania, żądanie jest dozwolone.
- API Gateway przechodzi tylko przez uwierzytelnione żądania.
Amazon Cognito nie bierze udziału w sprawdzaniu uwierzytelniania, ponieważ funkcja Lambda może weryfikować tokeny dostępu OAuth2 za pomocą sprawdzania poprawności tokena internetowego JSON (JWT).
1 Wdrażanie przepływu OAuth2
W tej sekcji wdrożysz pierwszą część rozwiązania, czyli przepływ OAuth2. Przepływ OAuth2 jest odpowiedzialny za wydawanie i utrzymywanie tokenów dostępu OAuth2 w magazynie plików cookie przeglądarki.
1.1 Utwórz sztuczny chroniony backend
Jak pokazano na rysunku nr 2, musisz chronić backend. Na potrzeby tego tekstu tworzysz próbny backend, tworząc prostą funkcję Lambda z domyślną odpowiedzią.
Aby utworzyć funkcję Lambda
- W konsoli Lambda wybierz: Utwórz funkcję
Uwaga: upewnij się, że wybrałeś swój Region AWS
- Wybierz Autor od podstaw jako opcję tworzenia funkcji.
- W sekcji Informacje podstawowe, jak pokazano, wprowadź lub wybierz następujące wartości:
- W polu Nazwa funkcji wpisz getProtectedResource.
- Jako środowisko wykonawcze wybierz Node.js 16.x.
- W przypadku architektury wybierz arm64, ponieważ arm64 został zaprojektowany jako szybszy i tańszy.
- Wybierz Utwórz funkcję.
Domyślny kod funkcji Lambda zwraca prosty komunikat Hello from Lambda, który jest wystarczający do zademonstrowania koncepcji tego rozwiązania.
- Utwórz API HTTP w Amazon API Gateway
Następnie utwórz interfejs API protokołu HTTP przy użyciu bramy interfejsu API. Będzie działać interfejs API HTTP lub interfejs API REST. W tym przykładzie wybierz interfejs HTTP API, ponieważ jest oferowany w niższej cenie (pamiętaj, że w tym tutorialu pozostajesz w warstwie bezpłatnej).
Aby utworzyć interfejs Gateway API
- W konsoli API Gateway, w HTTP API, wybierz Build.
- Na stronie Utwórz i skonfiguruj integracje, jak pokazano na rysunku nr 4, wybierz opcję Dodaj integrację, a następnie wprowadź lub wybierz następujące wartości:
- Wybierz Lambda.
- W przypadku funkcji Lambda wybierz funkcję getProtectedResource Lambda utworzoną w poprzedniej sekcji.
- W polu Nazwa interfejsu API wprowadź nazwę. W tym przykładzie użyto MyApp.
- Wybierz Dalej.
- Na stronie Konfiguruj trasy, jak pokazano na rysunku nr 5, wprowadź lub wybierz następujące wartości:
- Jako Metodę wybierz GET.
- W polu Ścieżka zasobu wprowadź / (pojedynczy ukośnik).
- Jako Cel integracji wybierz funkcję getProtectedResource
- Wybierz Dalej.
- Na stronie Konfiguruj etapy zachowaj wszystkie domyślne opcje i wybierz Dalej.
- Na stronie Przejrzyj i utwórz wybierz opcję Utwórz.
- Zanotuj wartość Invoke URL, jak pokazano na rysunku nr 6.
Teraz nadszedł czas, aby przetestować API Gateway API. Wklej wartość Invoke URL do przeglądarki. Zobaczysz następujący komunikat z twojej funkcji Lambda: Hello from Lambda.
Użyj Amazon Cognito
Użyjesz pul użytkowników Amazon Cognito do tworzenia i utrzymywania katalogu użytkowników oraz dodawania rejestracji i logowania do swojej aplikacji internetowej.
Aby utworzyć pulę użytkowników Amazon Cognito
- W konsoli Amazon Cognito wybierz Utwórz pulę użytkowników.
- Na stronie Dostawcy uwierzytelniania, jak pokazano na rysunku nr 7, dla opcji logowania do puli użytkowników Cognito wybierz E-mail, a następnie wybierz Dalej.
- W okienku Uwierzytelnianie wieloskładnikowe na stronie Konfiguruj wymagania dotyczące zabezpieczeń, jak przedstawiono na rysunku nr 8, wybierz MFA. W tym przykładzie wybierz opcję Brak usługi MFA, aby ułatwić testowanie rozwiązania. Jednak w środowisku produkcyjnym dla obciążeń wrażliwych na dane należy wybrać opcję Wymagaj usługi MFA – zalecane. Wybierz Dalej.
- 4 Na stronie Konfiguruj rejestrację zachowaj wszystkie domyślne opcje i wybierz Dalej.
- Na stronie Konfiguruj dostarczanie wiadomości, jak pokazano na rysunku nr 9, wybierz dostawcę poczty e-mail. W tym przykładzie wybierz opcję Wyślij wiadomość e-mail za pomocą Cognito, aby ułatwić testowanie rozwiązania. W przypadku obciążeń produkcyjnych należy wybrać opcję Wyślij wiadomość e-mail za pomocą usługi Amazon SES – zalecane. Wybierz Dalej.
- W sekcji Nazwa puli użytkowników na stronie Zintegruj swoją aplikację, jak pokazano na rysunku nr 10, wprowadź lub wybierz następujące wartości:
- W polu Nazwa puli użytkowników wprowadź nazwę. W tym przykładzie użyłem MyUserPool.
- W sekcji Hostowane strony uwierzytelniania, jak przedstawiono na rysunku nr 11, wybierz opcję Użyj hostowanego interfejsu użytkownika Cognito.
- W sekcji Domena, jak pokazano na rysunku nr 12, dla opcji Typ domeny wybierz opcję Użyj domeny Cognito. W polu Domena Cognito wprowadź nazwę domeny. Pamiętaj, że domeny w Cognito muszą być unikalne. Miej także świadomość, aby wpisać unikalną nazwę, na przykład dodając losowe liczby na końcu nazwy domeny. W tym przykładzie użyłem https://http-only-cookie-secured-app.
W sekcji Początkowy klient aplikacji, jak pokazano na rysunku nr 13, wprowadź lub wybierz następujące wartości:
- Dla opcji Typ aplikacji zachowaj ustawienie domyślne Klient publiczny.
- W polu Nazwa klienta aplikacji wprowadź przyjazną nazwę. W tym przykładzie użyto MyAppClient.
- W przypadku klucza tajnego klienta zachowaj ustawienie domyślne Nie generuj klucza tajnego klienta.
- W polu Dozwolone adresy URL wywołania zwrotnego wpisz /oauth2/callback, zastępując adresem URL wywołania, który zanotowałeś w API Gateway w poprzedniej sekcji.
- Wybierz Dalej
- Wybierz Utwórz pulę użytkowników
Następnie musisz pobrać niektóre informacje Amazon Cognito w celu późniejszego wykorzystania.
Aby zapisać informacje Amazon Cognito
- W konsoli Amazon Cognito wybierz pulę użytkowników utworzoną w poprzednich krokach.
- W obszarze Przegląd puli użytkowników zanotuj wartość identyfikatora puli użytkowników.
- Na karcie Integracja aplikacji w obszarze Domena Cognito zanotuj wartość Domena.
- W obszarze Lista klientów aplikacji zanotuj wartość identyfikatora klienta.
- W obszarze Lista klientów aplikacji wybierz nazwę klienta aplikacji utworzoną w poprzednich krokach.
- W obszarze Hostowany interfejs użytkownika zanotuj wartość Dozwolone adresy URL wywołania zwrotnego.
Następnie utwórz użytkownika, którego użyjesz w dalszej części tego wpisu w celu uruchomienia testu.
Aby utworzyć użytkownika
- W konsoli Amazon Cognito wybierz pulę użytkowników utworzoną w poprzednich krokach.
- W sekcji Użytkownicy wybierz opcję Utwórz użytkownika.
- W polu Adres e-mail wpisz user@example.com. W tym tutorialu nie musisz wysyłać rzeczywistych wiadomości e-mail, więc adres e-mail nie musi faktycznie istnieć.
- Wybierz Oznacz adres e-mail jako zweryfikowany.
- W przypadku hasła wprowadź hasło, które możesz zapamiętać (lub jeszcze lepiej: użyj generatora haseł).
- Zapamiętaj adres e-mail i hasło do późniejszego wykorzystania.
- Wybierz Utwórz użytkownika.
1.4. Utwórz funkcję Lambda oAuth2Callback
Następnie tworzysz funkcję Lambda oAuth2Callback, która jest odpowiedzialna za wydawanie i utrwalanie tokenów dostępu OAuth2.
Aby utworzyć funkcję Lambda oAuth2Callback
- W konsoli Lambda wybierz Utwórz funkcję.
Uwaga: Upewnij się, że wybrałeś żądany Region.
- W polu Nazwa funkcji wpisz oAuth2Callback.
- Jako środowisko wykonawcze wybierz Node.js 16.x.
- W obszarze Architektura wybierz opcję arm64.
- Wybierz Utwórz funkcję.
Po utworzeniu funkcji Lambda musisz dodać kod. Utwórz nowy folder na komputerze lokalnym i otwórz go w preferowanym zintegrowanym środowisku programistycznym (IDE). Dodaj pliki package.json i index.js, jak pokazano w poniższych przykładach.
package.json
W terminalu w katalogu głównym utworzonego folderu uruchom następujące polecenie.
$ npm install
W poniższym przykładowym kodzie index.js pamiętaj o zastąpieniu symboli zastępczych własnymi wartościami.
index.js
const qs = require("qs");
const axios = require("axios").default;
exports.handler = async function (event) {
const code = event.queryStringParameters?.code;
if (code == null) {
return {
statusCode: 400,
body: "code query param required",
};
}
const data = {
grant_type: "authorization_code",
client_id: "",
// The redirect has already happened, but you still need to pass the URI for validation, so a valid oAuth2 access token can be generated
redirect_uri: encodeURI(""),
code: code,
};
// Every Cognito instance has its own token endpoints. For more information check the documentation: https://docs.aws.amazon.com/cognito/latest/developerguide/token-endpoint.html
const res = await axios.post(
"/oauth2/token",
qs.stringify(data),
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
},
}
);
return {
statusCode: 302,
// These headers are returned as part of the response to the browser.
headers: {
// The Location header tells the browser it should redirect to the root of the URL
Location: "/",
// The Set-Cookie header tells the browser to persist the access token in the cookie store
"Set-Cookie": `accessToken=${res.data.access_token}; Secure; HttpOnly; SameSite=Lax; Path=/`,
},
};
};
Wraz z atrybutem HttpOnly przekazujesz dwa dodatkowe atrybuty plików cookie:
- Bezpieczny – wskazuje, że pliki cookie są wysyłane przez przeglądarkę do serwera tylko wtedy, gdy wysyłane jest żądanie za pomocą schematu https:.
- SameSite – Kontroluje, czy plik cookie jest wysyłany z żądaniami między witrynami, zapewniając ochronę przed atakami polegającymi na fałszowaniu żądań między witrynami. Ustawiasz wartość na Lax, ponieważ chcesz, aby plik cookie był ustawiany, gdy użytkownik jest przekazywany z Amazon Cognito do Twojej aplikacji internetowej (która działa pod innym adresem URL).
Aby uzyskać więcej informacji, zobacz Używanie plików cookie HTTP w witrynie MDN Web Docs.
Następnie prześlij kod do funkcji oAuth2Callback Lambda zgodnie z opisem w Przekazywanie funkcji Lambda w AWS Toolkit for VS Code User Guide.
1.5 Skonfiguruj trasę wywołania zwrotnego OAuth2 w API Gateway
Teraz skonfigurujesz API Gateway do korzystania z nowej funkcji Lambda poprzez integrację z proxy Lambda
Aby skonfigurować API Gateway w celu użycia funkcji Lambda
- W konsoli API Gateway, w obszarze API wybierz swoją nazwę API. W przykładzie nazwa to MyApp.
- W sekcji Develop wybierz Trasy.
- Wybierz Utwórz.
- Wprowadź lub wybierz następujące wartości:
- Jako metodę wybierz GET.
- Jako ścieżkę wpisz /oauth2/callback.
- Wybierz Utwórz.
- Wybierz GET w /oauth2/callback, a następnie wybierz Dołącz integrację.
- Wybierz opcję Utwórz i dołącz integrację.
- Jako Typ integracji wybierz funkcję Lambda.
- Dla funkcji Lambda wybierz oAuth2Callback z ostatniego kroku.
- Wybierz Utwórz.
Twoja konfiguracja trasy w API Gateway powinna teraz wyglądać jak na rysunku nr 14.
2 Wdrażanie przepływu OAuth2
Teraz, gdy posiadasz już komponenty, możesz przetestować przepływ OAuth2. Testujesz przepływ OAuth2, uruchamiając login w swojej przeglądarce.
Aby przetestować przepływ OAuth2
- W konsoli Amazon Cognito wybierz nazwę swojej puli użytkowników. W przykładzie nazwa to MyUserPool.
- Na kartach nawigacji wybierz opcję Integracja aplikacji.
- W obszarze Lista klientów aplikacji wybierz nazwę klienta aplikacji. W artykule nazwa to MyAppClient.
- Wybierz Wyświetl hostowany interfejs użytkownika.
- Na nowo otwartej karcie przeglądarki otwórz narzędzia programistyczne, aby móc sprawdzić żądania sieciowe.
- Zaloguj się za pomocą adresu e-mail i hasła ustawionego w poprzedniej sekcji. Zmień hasło, jeśli zostaniesz o to poproszony. Możesz także wybrać to samo hasło, które ustawiłeś w poprzedniej sekcji.
- Powinieneś zobaczyć wiadomość Hello from Lambda.
Aby sprawdzić, czy plik cookie został prawidłowo umieszczony
- Sprawdź zakładkę sieci w przeglądarce w ustawieniach przeglądarki programisty. Zobaczysz żądanie /oauth2/callback, jak pokazano na rysunku 15.
- Nagłówki odpowiedzi powinny zawierać nagłówek set-cookie, jak określono w funkcji Lambda. Dzięki nagłówkowi set-cookie token dostępu OAuth2 jest ustawiany jako plik cookie HttpOnly w przeglądarce, a dostęp jest zabroniony z dowolnego kodu po stronie klienta.
- Alternatywnie możesz sprawdzić plik cookie w pamięci cookie przeglądarki, jak pokazano na rysunku 16.
- Jeśli chcesz ponowić próbę uwierzytelnienia, przejdź w przeglądarce do domeny Amazon Cognito, którą wybrałeś w poprzedniej sekcji i wyczyść wszystkie dane witryny w narzędziach deweloperskich przeglądarki. Zrób to samo z adresem URL wywołania bramy interfejsu API. Teraz możesz ponownie uruchomić test z clean state.
3. Wdrażanie weryfikacji uwierzytelnienia
W tej sekcji wdrożysz drugą część swojej aplikacji: weryfikację uwierzytelnienia. Kontrola uwierzytelniania sprawia, że tylko zweryfikowani użytkownicy mogą uzyskać dostęp do chronionego zaplecza. Kontrola uwierzytelniania działa z plikiem cookie HttpOnly, który jest przechowywany w magazynie plików cookie użytkownika.
3.1 Utwórz funkcję Lambda oAuth2Authorizer
Ta funkcja Lambda sprawdza, czy żądania są uwierzytelnione.
Aby utworzyć funkcję Lambda
- W konsoli Lambda wybierz Utwórz funkcję.
Uwaga: Upewnij się, że wybrałeś żądany Region.
- W polu Nazwa funkcji wpisz oAuth2Authorizer.
- Jako środowisko wykonawcze wybierz Node.js 16.x.
- W obszarze Architektura wybierz opcję arm64.
- Wybierz Utwórz funkcję.
Po utworzeniu funkcji Lambda musisz dodać kod. Utwórz nowy folder na komputerze lokalnym i otwórz go za pomocą preferowanego IDE. Dodaj pliki package.json i index.js, jak pokazano w poniższych przykładach.
package.json
W terminalu w katalogu głównym utworzonego folderu uruchom następujące polecenie.
$ npm install
Pamiętaj, aby w przykładowym kodzie index.js zastąpić symbole zastępcze własnymi wartościami.
index.js
const { CognitoJwtVerifier } = require("aws-jwt-verify");
function getAccessTokenFromCookies(cookiesArray) {
// cookieStr contains the full cookie definition string: "accessToken=abc"
for (const cookieStr of cookiesArray) {
const cookieArr = cookieStr.split("accessToken=");
// After splitting you should get an array with 2 entries: ["", "abc"] - Or only 1 entry in case it was a different cookie string: ["test=test"]
if (cookieArr[1] != null) {
return cookieArr[1]; // Returning only the value of the access token without cookie name
}
}
return null;
}
// Create the verifier outside the Lambda handler (= during cold start),
// so the cache can be reused for subsequent invocations. Then, only during the
// first invocation, will the verifier actually need to fetch the JWKS.
const verifier = CognitoJwtVerifier.create({
userPoolId: "",
tokenUse: "access",
clientId: "",
});
exports.handler = async (event) => {
if (event.cookies == null) {
console.log("No cookies found");
return {
isAuthorized: false,
};
}
// Cookies array looks something like this: ["accessToken=abc", "otherCookie=Random Value"]
const accessToken = getAccessTokenFromCookies(event.cookies);
if (accessToken == null) {
console.log("Access token not found in cookies");
return {
isAuthorized: false,
};
}
try {
await verifier.verify(accessToken);
return {
isAuthorized: true,
};
} catch (e) {
console.error(e);
return {
isAuthorized: false,
};
}
};
Po dodaniu plików package.json i index.js przekaż kod do funkcji Lambda oAuth2Authorizer zgodnie z opisem w temacie Upload a Lambda Function w AWS Toolkit for VS Code User Guide.
3.2 Skonfiguruj organ upoważniający Lambda w API Gateway
Następnie skonfiguruj funkcję Lambda autoryzatora, aby chronić zaplecze. W ten sposób kontrolujesz dostęp do swojego HTTP API.
Aby skonfigurować autoryzator funkcji Lambda
- W konsoli API Gateway, w obszarze API wybierz swoją nazwę API. W tutorial nazwa to MyApp.
- W sekcji Develop wybierz Trasy.
- W obszarze / (pojedynczy ukośnik) GET wybierz opcję Dołącz autoryzację.
- Wybierz opcję Utwórz i dołącz autoryzację.
- Wybierz Lambda.
- Wprowadź lub wybierz następujące wartości:
- W polu Nazwa wprowadź oAuth2Authorizer.
- Dla funkcji Lambda wybierz oAuth2Authorizer.
- Wyczyść pamięć podręczną autoryzacji. W tym tutorialu wyłączysz buforowanie autoryzacji, aby uprościć testowanie. Zobacz sekcję Bonus: Włączanie buforowania autoryzacji, aby uzyskać więcej informacji na temat włączania buforowania w celu zwiększenia wydajności.
- W obszarze Źródła tożsamości wybierz opcję Usuń.
Uwaga: źródła tożsamości są ignorowane dla autoryzacji Lambda. Są one używane tylko do buforowania.
- Wybierz Utwórz i dołącz.
- W sekcji Develop wybierz Trasy, aby sprawdzić wszystkie trasy.
Teraz twoja trasa API Gateway /oauth2/callback powinna być skonfigurowana tak, jak pokazano na rysunku nr 17.
Testowanie OAuth2 authorizer
Udało Ci się! Od ostatniego testu nadal powinieneś być uwierzytelniony. Tak więc, jeśli otworzysz adres URL API Gateway Invoke w przeglądarce, zostaniesz powitany z chronionego zaplecza.
Jeśli nie jesteś już uwierzytelniony, będziesz musiał ponownie wykonać kroki z sekcji Testowanie przepływu OAuth2 w celu uwierzytelnienia.
Gdy sprawdzisz żądanie HTTP wysyłane przez przeglądarkę w narzędziach programistycznych, jak pokazano na rysunku nr 18, zobaczysz, że uwierzytelnianie działa, ponieważ plik cookie HttpOnly jest automatycznie dołączany do każdego żądania.
Aby sprawdzić, czy funkcja authorizer Lambda działa poprawnie, wklej ten sam adres URL Invoke, który zanotowałeś wcześniej w oknie incognito. Okna incognito nie współdzielą magazynu plików cookie z sesją przeglądarki, dlatego wyświetlany jest komunikat o błędzie {"message":"Zabronione"} z kodem odpowiedzi HTTP 403 – Zabronione.
Porządkowanie
Usuń wszystkie niechciane zasoby, aby uniknąć ponoszenia kosztów.
Aby usunąć domenę Amazon Cognito i pulę użytkowników
- W konsoli Amazon Cognito wybierz nazwę swojej puli użytkowników. W tutorialu nazwa to MyUserPool.
- Na kartach nawigacji wybierz opcję Integracja aplikacji.
- W obszarze Domena wybierz Działania, a następnie Usuń domenę Cognito.
- Potwierdź, wprowadzając niestandardową domenę Amazon Cognito i wybierz Usuń.
- Wybierz Usuń pulę użytkowników.
- Potwierdź, wprowadzając nazwę swojej puli użytkowników (w moim przypadku MyUserPool), a następnie wybierz Usuń.
Aby usunąć zasób API Gateway
- W konsoli API Gateway wybierz swoją nazwę API. W przykładzie nazwa to MyApp.
- W obszarze Działania wybierz opcję Usuń i potwierdź usunięcie.
Aby usunąć funkcje AWS Lambda
- W konsoli Lambda wybierz wszystkie trzy utworzone funkcje Lambda.
- W obszarze Działania wybierz opcję Usuń i potwierdź usunięcie.
Bonus: Włączenie buforowania autoryzacji
Jak wspomniano wcześniej, możesz włączyć buforowanie autoryzacji, aby poprawić wydajność. Gdy buforowanie jest włączone dla autoryzacji, API Gateway używa źródeł tożsamości autoryzacji jako klucza pamięci podręcznej. Jeśli klient określi te same parametry w źródłach tożsamości w ramach skonfigurowanego czasu wygaśnięcia (TTL), brama interfejsu API użyje wyniku autoryzacji z pamięci podręcznej, zamiast wywoływać funkcję Lambda.
Aby włączyć buforowanie, autoryzator musi mieć co najmniej jedno źródło tożsamości. Aby buforować według nagłówka żądania pliku cookie, należy określić $request.header.cookie jako źródło tożsamości. Należy pamiętać, że wpłynie to na buforowanie, jeśli przekażesz dodatkowe pliki cookie HttpOnly oprócz tokena dostępu.
Aby uzyskać więcej informacji, zobacz Working with AWS Lambda authorizers for HTTP APIs w Podręczniku programisty Amazon API Gateway.
Wnioski
Za pomocą tego artykułu dowiedziałeś się, jak zaimplementować uwierzytelnianie przy użyciu plików cookie HttpOnly. Użyłeś Amazon API Gateway i AWS Lambda do utrwalania i sprawdzania poprawności plików cookie HttpOnly, a Amazon Cognito do wystawiania tokenów dostępu OAuth2. Jeśli chcesz wypróbować zautomatyzowane wdrożenie tego rozwiązania za pomocą skryptu, zobacz repozytorium GitHub api-gw-http-only-cookie-auth.
Zastosowanie tego rozwiązania do ochrony Twoich tajemnic przed potencjalnymi atakami cross-site scripting (XSS) nie ogranicza się do OAuth2. Możesz chronić inne rodzaje tokenów, sesji lub identyfikatorów śledzenia za pomocą plików cookie HttpOnly.
W tym rozwiązaniu użyłeś NodeJS dla swoich funkcji Lambda w celu zaimplementowania uwierzytelniania. Ale pliki cookie HttpOnly są szeroko obsługiwane przez wiele platform programistycznych. Więcej opcji implementacji można znaleźć na stronie OWASP Secure Cookie Attribute.
Chociaż artykuł zawiera tutorial dotyczący implementacji uwierzytelniania plików cookie HttpOnly w usłudze API Gateway, może on nie spełniać wszystkich wymagań dotyczących zabezpieczeń i funkcjonalności. Pamiętaj, aby sprawdzić swoje wymagania biznesowe i porozmawiać z interesariuszami, zanim zastosujesz techniki omawiane w tym artykule.
Ponadto dobrym pomysłem jest ciągłe testowanie aplikacji internetowej, aby pliki cookie były umieszczane tylko z zatwierdzonymi atrybutami bezpieczeństwa. Więcej informacji możesz znaleźć na stronie OWASP Testing for Cookies Attributes.
Źródło: AWS