Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Kontrol akses HTTP APIs dengan JWT otorisasi di API Gateway
Anda dapat menggunakan JSON Web Tokens (JWTs) sebagai bagian dari kerangka kerja OpenID Connect (OIDC)
Jika Anda mengonfigurasi JWT otorisasi untuk rute AndaAPI, API Gateway memvalidasi JWTs yang dikirimkan klien dengan API permintaan. APIGateway memungkinkan atau menolak permintaan berdasarkan validasi token, dan secara opsional, cakupan dalam token. Jika Anda mengonfigurasi cakupan untuk rute, token harus menyertakan setidaknya satu cakupan rute.
Anda dapat mengonfigurasi otorisasi yang berbeda untuk setiap ruteAPI, atau menggunakan otorisasi yang sama untuk beberapa rute.
catatan
Tidak ada mekanisme standar untuk membedakan token JWT akses dari jenis lainJWTs, seperti token OpenID Connect ID. Kecuali Anda memerlukan token ID untuk API otorisasi, kami sarankan Anda mengonfigurasi rute Anda agar memerlukan cakupan otorisasi. Anda juga dapat mengonfigurasi JWT otorisasi untuk mewajibkan penerbit atau audiens yang hanya digunakan penyedia identitas Anda saat mengeluarkan JWT token akses.
Mengotorisasi API permintaan dengan otorisasi JWT
APIGateway menggunakan alur kerja umum berikut untuk mengotorisasi permintaan ke rute yang dikonfigurasi untuk menggunakan otorisasi. JWT
-
identitySource
Periksa token.identitySource
Dapat hanya menyertakan token, atau token yang diawali denganBearer
. -
Mendekode token.
-
Periksa algoritma dan tanda tangan token dengan menggunakan kunci publik yang diambil dari penerbit.
jwks_uri
Saat ini, hanya algoritma RSA berbasis yang didukung. APIGateway dapat menyimpan kunci publik selama dua jam. Sebagai praktik terbaik, saat Anda memutar tombol, izinkan masa tenggang di mana kunci lama dan baru valid. -
Validasi klaim. APIGateway mengevaluasi klaim token berikut:
-
kid
— Token harus memiliki klaim header yang cocok dengan kunci jwks_uri
yang menandatangani token. -
iss
— Harus cocok dengan issuer
yang dikonfigurasi untuk otorisasi. -
aud
atau client_id
— Harus cocok dengan salah satuaudience
entri yang dikonfigurasi untuk otorisasi. APIGatewayclient_id
hanya memvalidasi jika tidakaud
ada. Ketika keduanyaaud
danclient_id
hadir, API Gateway mengevaluasi.aud
-
exp
— Harus setelah waktu saat ini masukUTC. -
nbf
— Harus sebelum waktu saat ini masukUTC. -
iat
— Harus sebelum waktu saat ini masukUTC. -
scope
atau scp
— Token harus menyertakan setidaknya satu cakupan dalam rute.authorizationScopes
-
Jika salah satu dari langkah-langkah ini gagal, API Gateway menolak API permintaan tersebut.
Setelah memvalidasiJWT, API Gateway meneruskan klaim dalam token ke integrasi API rute. Sumber daya backend, seperti fungsi Lambda, dapat mengakses klaim. JWT Misalnya, jika JWT menyertakan klaim identitasemailID
, itu tersedia untuk integrasi Lambda di. $event.requestContext.authorizer.jwt.claims.emailID
Untuk informasi selengkapnya tentang payload yang dikirim API Gateway ke integrasi Lambda, lihat. Buat integrasi AWS Lambda proxy untuk HTTP APIs di API Gateway
Buat JWT Authorizer
Sebelum Anda membuat JWT otorisasi, Anda harus mendaftarkan aplikasi klien dengan penyedia identitas. Anda juga harus membuat sebuah HTTPAPI. Untuk contoh membuat HTTPAPI, lihatBuat API HTTP.
Buat JWT otorisasi menggunakan konsol
Langkah-langkah berikut menunjukkan cara membuat JWT authorizer menggunakan konsol.
Untuk membuat JWT otorisasi menggunakan konsol
Masuk ke konsol API Gateway di https://console.aws.amazon.com/apigateway
. Pilih sebuah HTTPAPI.
Di panel navigasi utama, pilih Otorisasi.
Pilih tab Kelola otorisasi.
Pilih Buat.
Untuk jenis Authorizer, pilih JWT.
Konfigurasikan JWT otorisasi Anda, dan tentukan sumber Identitas yang menentukan sumber token.
Pilih Buat.
Buat JWT otorisasi menggunakan AWS CLI
AWS CLI Perintah berikut membuat JWT authorizer. Untukjwt-configuration
, tentukan Audience
dan Issuer
untuk penyedia identitas Anda. Jika Anda menggunakan Amazon Cognito sebagai penyedia identitas, itu adalah. IssuerUrl
https://cognito-idp.
us-east-2
.amazonaws.com/userPoolID
aws apigatewayv2 create-authorizer \ --name
authorizer-name
\ --api-idapi-id
\ --authorizer-type JWT \ --identity-source '$request.header.Authorization
' \ --jwt-configuration Audience=audience
,Issuer=IssuerUrl
Buat JWT otorisasi menggunakan AWS CloudFormation
AWS CloudFormation Template berikut membuat HTTP API dengan JWT otorisasi yang menggunakan Amazon Cognito sebagai penyedia identitas.
Output dari AWS CloudFormation template adalah URL untuk UI yang dihosting Amazon Cognito tempat klien dapat mendaftar dan masuk untuk menerima file. JWT Setelah klien masuk, klien dialihkan ke Anda HTTP API dengan token akses diURL. Untuk memanggil API dengan token akses, ubah #
in ke a URL ?
untuk menggunakan token sebagai parameter string kueri.
AWSTemplateFormatVersion: '2010-09-09' Description: | Example HTTP API with a JWT authorizer. This template includes an Amazon Cognito user pool as the issuer for the JWT authorizer and an Amazon Cognito app client as the audience for the authorizer. The outputs include a URL for an Amazon Cognito hosted UI where clients can sign up and sign in to receive a JWT. After a client signs in, the client is redirected to your HTTP API with an access token in the URL. To invoke the API with the access token, change the '#' in the URL to a '?' to use the token as a query string parameter. Resources: MyAPI: Type: AWS::ApiGatewayV2::Api Properties: Description: Example HTTP API Name: api-with-auth ProtocolType: HTTP Target: !GetAtt MyLambdaFunction.Arn DefaultRouteOverrides: Type: AWS::ApiGatewayV2::ApiGatewayManagedOverrides Properties: ApiId: !Ref MyAPI Route: AuthorizationType: JWT AuthorizerId: !Ref JWTAuthorizer JWTAuthorizer: Type: AWS::ApiGatewayV2::Authorizer Properties: ApiId: !Ref MyAPI AuthorizerType: JWT IdentitySource: - '$request.querystring.access_token' JwtConfiguration: Audience: - !Ref AppClient Issuer: !Sub https://cognito-idp.${AWS::Region}.amazonaws.com/${UserPool} Name: test-jwt-authorizer MyLambdaFunction: Type: AWS::Lambda::Function Properties: Runtime: nodejs18.x Role: !GetAtt FunctionExecutionRole.Arn Handler: index.handler Code: ZipFile: | exports.handler = async (event) => { const response = { statusCode: 200, body: JSON.stringify('Hello from the ' + event.routeKey + ' route!'), }; return response; }; APIInvokeLambdaPermission: Type: AWS::Lambda::Permission Properties: FunctionName: !Ref MyLambdaFunction Action: lambda:InvokeFunction Principal: apigateway.amazonaws.com SourceArn: !Sub arn:${AWS::Partition}:execute-api:${AWS::Region}:${AWS::AccountId}:${MyAPI}/$default/$default FunctionExecutionRole: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Version: '2012-10-17' Statement: - Effect: Allow Principal: Service: - lambda.amazonaws.com Action: - 'sts:AssumeRole' ManagedPolicyArns: - arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole UserPool: Type: AWS::Cognito::UserPool Properties: UserPoolName: http-api-user-pool AutoVerifiedAttributes: - email Schema: - Name: name AttributeDataType: String Mutable: true Required: true - Name: email AttributeDataType: String Mutable: false Required: true AppClient: Type: AWS::Cognito::UserPoolClient Properties: AllowedOAuthFlows: - implicit AllowedOAuthScopes: - aws.cognito.signin.user.admin - email - openid - profile AllowedOAuthFlowsUserPoolClient: true ClientName: api-app-client CallbackURLs: - !Sub https://${MyAPI}.execute-api.${AWS::Region}.amazonaws.com ExplicitAuthFlows: - ALLOW_USER_PASSWORD_AUTH - ALLOW_REFRESH_TOKEN_AUTH UserPoolId: !Ref UserPool SupportedIdentityProviders: - COGNITO HostedUI: Type: AWS::Cognito::UserPoolDomain Properties: Domain: !Join - '-' - - !Ref MyAPI - !Ref AppClient UserPoolId: !Ref UserPool Outputs: SignupURL: Value: !Sub https://${HostedUI}.auth.${AWS::Region}.amazoncognito.com/login?client_id=${AppClient}&response_type=token&scope=email+profile&redirect_uri=https://${MyAPI}.execute-api.${AWS::Region}.amazonaws.com
Memperbarui rute untuk menggunakan JWT otorisasi
Anda dapat menggunakan konsol, AWS CLI, atau AWS SDK untuk memperbarui rute untuk menggunakan JWT otorisasi.
Memperbarui rute untuk menggunakan JWT otorisasi dengan menggunakan konsol
Langkah-langkah berikut menunjukkan cara memperbarui rute untuk menggunakan JWT otorisasi menggunakan konsol.
Untuk membuat JWT otorisasi menggunakan konsol
Masuk ke konsol API Gateway di https://console.aws.amazon.com/apigateway
. Pilih sebuah HTTPAPI.
Di panel navigasi utama, pilih Otorisasi.
-
Pilih metode, lalu pilih otorisasi Anda dari menu tarik-turun, dan pilih Lampirkan otorisasi.
Perbarui rute untuk menggunakan JWT otorisasi dengan menggunakan AWS CLI
Perintah berikut memperbarui rute untuk menggunakan JWT otorisasi menggunakan file. AWS CLI
aws apigatewayv2 update-route \ --api-id
api-id
\ --route-idroute-id
\ --authorization-type JWT \ --authorizer-idauthorizer-id
\ --authorization-scopesuser.email