Sytuacja kobiet w IT w 2024 roku
3.09.20193 min
Gavin Lewis

Gavin LewisCloud ArchitectRapid Circle

Zabezpieczenie API Gateway z Lambda Authorizers

Sprawdź, jak krok po kroku zabezpieczyć API Gateway przy użyciu Lambda Authorizers i tokenów JWT.

Zabezpieczenie API Gateway z Lambda Authorizers

API Gateway z Cognito jako strażnikiem to potężna kombinacja, ale kiedy Cognito nie jest najlepszym wyborem, to jakie są inne opcje? AWS oferuje szereg opcji, takich jak Resource Policies, klucze API i IAM - a dalej są Lambda Authorizers. Mogą być one oparte na tokenach lub na żądaniach.

Cytat z dokumentacji:

  • Lambda Authorizer wykorzystujący tokeny (zwany także TOKEN authorizer), otrzymuje informacje o tożsamości odbiera tożsamość wywołującego w tokenie okaziciela, takim jak Json Web Token (JWT) lub tokenie OAuth..
  • Lambda Authorizer wykorzystujący parametry żądania (zwany również REQUEST authorizer), otrzymuje informacje o tożsamości wywołującego w kombinacji nagłówków, parametrów w zapytaniu, zmiennych stanu i kontekstu.


W tym przewodniku skupię się na autoryzatorach opartych na tokenach. Jeśli nigdy nie słyszałeś o JWT, sprawdź jwt.io.

Dla mnie magią jest, że prawie każda baza danych lub inne źródło danych podane przez użytkownika może być użyte jako źródło do generowania tokenów. Jednym z naprawdę świetnych przykładów i prawdopodobnie jedną z najpopularniejszych alternatyw Cognito jest Auth0, który może działać jako źródło uwierzytelniania dla API Gateway poprzez użycie Lambda Authorizers.

Na początek utworzę nową aplikację serverless:

sls create --template aws-csharp --path customauthorizer


Następnym krokiem jest utworzenie klas, które pomogą nam wygenerować i zweryfikować JWT. Podziękowania dla Moshe Binieli za jego kod, który był bazą tego wszystkiego.

Musimy utworzyć 4 pliki w katalogu z serwisami:

  • Authorizer/Managers/IAuthService.cs
  • Authorizer/Managers/JWTService.cs
  • Authorizer/Models/IAuthContainerModel.cs
  • Authorizer/Models/JWTContainerModel.cs


Następnie dodaj następujące zmienne środowiskowe do serverless.yml - pamiętaj, aby zmienić sygnaturę na swoją własną i ustawić wygaśnięcie tokena tak, aby pasował do Twojego przypadku użycia!

environment:
ApiGatewayArn:
Fn::Join:
- ""
- - "arn:aws:execute-api"
- ":"
- Ref: AWS::Region
- ":"
- Ref: AWS::AccountId
- ":"
- Ref: ApiGatewayRestApi
- "/*/*/*"
# Used for generating the JWT for the user into API Gateway
HmacSignature: "ad94f8c800e4883ff7f6aa5ec96fbea34926b6ea5960c43a20941586e3f8eeb5"
HmacExpiry: 10080 # Minutes, 10080 is 7 days


Aby autoryzator działał, musimy utworzyć dwie dodatkowe funkcje Lambda:

  • Uwierzytelnianie: /Authorizer/Authenticate.cs
    Odwołaj się do logiki w tym pliku, aby uwierzytelnić użytkownika przed zwróceniem JWT. W tym przykładzie nie ma logiki uwierzytelnienia, możesz wprowadzić własną. Podczas pracy z nowoczesnymi aplikacjami internetowymi przechowuj zwrócony token w lokalnej pamięci przeglądarki, aby przekazywać go do API przy kolejnych żądniach.
  • Sprawdzanie tokena: /Authorizer/CheckToken.cs
    Służy do sprawdzania, czy token przekazywany przy kolejnych żądaniach jest nadal aktualny. Jeśli tak, zezwól użytkownikowi na wywołanie API. To zwróci dokument (policy document).


Te dwie funkcje Lambda również wymagają odniesienia w serverless.yml:

functions:
authorizerCheckToken:
handler: CsharpHandlers::Authorizer.CheckToken::FunctionHandler
authorizerAuthenticate:
handler: CsharpHandlers::Authorizer.Authenticate::FunctionHandler
events:
- http:
path: authenticate
method: get
integration: lambda
cors: true


Na koniec stworzymy funkcję testową. Sztuczka w definicji tej funkcji polega na dołączeniu autoryzatora: authorizerCheckToken, ponieważ dzięki temu API Gateway po wywołaniu będzie używać funkcji CheckToken jako naszego autoryzatora Lambda:

  • Handler.cs
hello:
handler: CsharpHandlers::Namespace.Handler::FunctionHandler
events:
- http:
path: hello
method: get
integration: lambda
cors: true
authorizer: authorizerCheckToken


Czas na deploy:

sh ./build.sh OR build.cmd (depending if you're using Windows, Mac or Linux)
sls deploy -v


Co się właściwie zadziało? Jeśli przejdziesz do API Gateway, wybierzesz API i przejdziesz do autoryzatorów, zobaczyć, że został utworzony Lambda Authorizer.

Zaznaczyłem funkcję hello, którą ma zabezpieczyć autoryzator Lambda. Jeśli przejdziemy do metody i wybierzemy Method Request, autoryzacja będzie miała ustawiony Lambda Authorizer.

Użyję Postmana do testowania moich API. Każde narzędzie wywołujące adresy URL będzie się do tego nadawało (np. curl). Wywołam funkcję hello bez dołączania mojego tokena - prośba powinna zostać odrzucona.

Aby uzyskać token, wywołam funkcję uwierzytelniania. Powinna ona zwrócić kod SUCCESS i token w odpowiedzi. Skopiuj token, by wykorzystać go w następnym kroku.

Następne żądanie do funkcji hello musi zawierać nagłówek Authorization, zawierający token z ostatniego kroku. Zakładając, że wszystko zostało poprawnie skonfigurowane, żądanie powinno zakończyć się powodzeniem.

Generując różne tokeny lub czekając na wygaśnięcie tokena, kolejne żądania do API Gateway powinny zostać odrzucone.


Oryginał tekstu w języku angielskim przeczytasz tutaj.

<p>Loading...</p>