Mengkonfigurasi otorisasi dan otentikasi untuk mengamankan GraphQL APIs - AWS AppSync

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Mengkonfigurasi otorisasi dan otentikasi untuk mengamankan GraphQL APIs

AWS AppSync menawarkan jenis otorisasi berikut untuk mengamankan APIs GraphQL: API keys, Lambda,, OpenID ConnectIAM, dan Cognito User Pools. Setiap opsi menyediakan metode keamanan yang berbeda:

  1. APIOtorisasi Kunci: Mengontrol pembatasan untuk tidak diautentikasiAPIs, memberikan opsi keamanan sederhana.

  2. Otorisasi Lambda: Mengaktifkan logika otorisasi khusus, menjelaskan input dan output fungsi secara rinci.

  3. IAMOtorisasi: Memanfaatkan AWS proses penandatanganan versi 4 tanda tangan, memungkinkan kontrol akses halus melalui kebijakan. IAM

  4. Otorisasi OpenID Connect: Terintegrasi dengan layanan yang OIDC sesuai untuk otentikasi pengguna.

  5. Cognito User Pools: Menerapkan kontrol akses berbasis grup menggunakan fitur manajemen pengguna Cognito.

Jenis otorisasi

Ada lima cara Anda dapat mengotorisasi aplikasi untuk berinteraksi dengan AWS AppSync API GraphQL Anda. Anda menentukan jenis otorisasi yang Anda gunakan dengan menentukan salah satu nilai jenis otorisasi berikut dalam panggilan atau Anda AWS AppSync API: CLI

  • API_KEY

    Untuk menggunakan API kunci.

  • AWS_LAMBDA

    Untuk menggunakan suatu AWS Lambda fungsi.

  • AWS_IAM

    Untuk menggunakan izin AWS Identity and Access Management (IAM).

  • OPENID_CONNECT

    Untuk menggunakan penyedia OpenID Connect Anda.

  • AMAZON_COGNITO_USER_POOLS

    Untuk menggunakan kumpulan pengguna Amazon Cognito.

Jenis otorisasi dasar ini berfungsi untuk sebagian besar pengembang. Untuk kasus penggunaan yang lebih lanjut, Anda dapat menambahkan mode otorisasi tambahan melalui konsol,CLI, dan AWS CloudFormation. Untuk mode otorisasi tambahan, AWS AppSync berikan jenis otorisasi yang mengambil nilai yang tercantum di atas (yaitu,,API_KEY, AWS_LAMBDA AWS_IAMOPENID_CONNECT, danAMAZON_COGNITO_USER_POOLS).

Saat Anda menentukanAPI_KEY,AWS_LAMBDA, atau AWS_IAM sebagai jenis otorisasi utama atau default, Anda tidak dapat menentukannya lagi sebagai salah satu mode otorisasi tambahan. Demikian pula, Anda tidak dapat menduplikasiAPI_KEY, AWS_LAMBDA atau AWS_IAM di dalam mode otorisasi tambahan. Anda dapat menggunakan beberapa Amazon Cognito User Pools dan penyedia OpenID Connect. Namun, Anda tidak dapat menggunakan duplikat Amazon Cognito User Pools atau penyedia OpenID Connect antara mode otorisasi default dan salah satu mode otorisasi tambahan. Anda dapat menentukan klien yang berbeda untuk Kumpulan Pengguna Amazon Cognito atau penyedia OpenID Connect menggunakan ekspresi reguler konfigurasi yang sesuai.

API_KEYotorisasi

Tidak diautentikasi APIs membutuhkan pembatasan yang lebih ketat daripada yang diautentikasi. APIs Salah satu cara untuk mengontrol pelambatan untuk titik akhir GraphQL yang tidak diautentikasi adalah melalui penggunaan kunci. API APIKunci adalah nilai hard-code dalam aplikasi Anda yang dihasilkan oleh AWS AppSync layanan saat Anda membuat titik akhir GraphQL yang tidak diautentikasi. Anda dapat memutar API tombol dari konsol, dariCLI, atau dari AWS AppSync APIreferensi.

Console
  1. Masuk ke AWS Management Console dan buka AppSynckonsol.

    1. Di APIsdasbor, pilih GraphQL API Anda.

    2. Di Sidebar, pilih Pengaturan.

  2. Di bawah mode otorisasi default, pilih APIkunci.

  3. Di tabel APItombol, pilih Tambah API kunci.

    APIKunci baru akan dihasilkan dalam tabel.

    1. Untuk menghapus API kunci lama, pilih API tombol di tabel dan kemudian pilih Hapus.

  4. Pilih Simpan di bagian bawah halaman.

CLI
  1. Jika Anda belum melakukannya, konfigurasikan akses Anda ke file AWS CLI. Untuk informasi selengkapnya, lihat Dasar-dasar konfigurasi.

  2. Buat objek API GraphQL dengan menjalankan perintah. update-graphql-api

    Anda harus mengetikkan dua parameter untuk perintah khusus ini:

    1. api-idGraphQL API Anda.

    2. Yang baru name dari AndaAPI. Anda dapat menggunakan hal yang samaname.

    3. Ituauthentication-type, yang akan menjadiAPI_KEY.

    catatan

    Ada parameter lain seperti Region yang harus dikonfigurasi tetapi biasanya akan default ke nilai CLI konfigurasi Anda.

    Contoh perintah mungkin terlihat seperti ini:

    aws appsync update-graphql-api --api-id abcdefghijklmnopqrstuvwxyz --name TestAPI --authentication-type API_KEY

    Output akan dikembalikan diCLI. Berikut adalah contoh diJSON:

    { "graphqlApi": { "xrayEnabled": false, "name": "TestAPI", "authenticationType": "API_KEY", "tags": {}, "apiId": "abcdefghijklmnopqrstuvwxyz", "uris": { "GRAPHQL": "https://s8i3kk3ufhe9034ujnv73r513e.appsync-api.us-west-2.amazonaws.com/graphql", "REALTIME": "wss://s8i3kk3ufhe9034ujnv73r513e.appsync-realtime-api.us-west-2.amazonaws.com/graphql" }, "arn": "arn:aws:appsync:us-west-2:348581070237:apis/abcdefghijklmnopqrstuvwxyz" } }

APIkunci dapat dikonfigurasi hingga 365 hari, dan Anda dapat memperpanjang tanggal kedaluwarsa yang ada hingga 365 hari dari hari itu. APIKunci direkomendasikan untuk tujuan pengembangan atau kasus penggunaan di mana aman untuk mengekspos publikAPI.

Pada klien, API kuncinya ditentukan oleh headerx-api-key.

Misalnya, jika ya'ABC123', Anda API_KEY dapat mengirim kueri curl GraphQL melalui sebagai berikut:

$ curl -XPOST -H "Content-Type:application/graphql" -H "x-api-key:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

AWS_LAMBDAotorisasi

Anda dapat menerapkan logika API otorisasi Anda sendiri menggunakan AWS Lambda fungsi. Anda dapat menggunakan fungsi Lambda untuk otorisasi primer atau sekunder Anda, tetapi mungkin hanya ada satu fungsi otorisasi Lambda per. API Saat menggunakan fungsi Lambda untuk otorisasi, berikut ini berlaku:

  • Jika mode API memiliki AWS_LAMBDA dan AWS_IAM otorisasi diaktifkan, maka tanda tangan SigV4 tidak dapat digunakan sebagai token otorisasi. AWS_LAMBDA

  • Jika API memiliki mode AWS_LAMBDA dan OPENID_CONNECT otorisasi atau mode AMAZON_COGNITO_USER_POOLS otorisasi diaktifkan, maka OIDC token tidak dapat digunakan sebagai token AWS_LAMBDA otorisasi. Perhatikan bahwa OIDC token dapat berupa skema Pembawa.

  • Fungsi Lambda tidak boleh mengembalikan lebih dari 5MB data kontekstual untuk resolver.

Misalnya, jika token otorisasi Anda'ABC123', Anda dapat mengirim kueri GraphQL melalui curl sebagai berikut:

$ curl -XPOST -H "Content-Type:application/graphql" -H "Authorization:ABC123" -d '{ "query": "query { movies { id } }" }' https://YOURAPPSYNCENDPOINT/graphql

Fungsi Lambda dipanggil sebelum setiap kueri atau mutasi. Nilai pengembalian dapat di-cache berdasarkan API ID dan token otentikasi. Secara default, caching tidak diaktifkan, tetapi ini dapat diaktifkan pada API tingkat atau dengan menetapkan ttlOverride nilai dalam nilai kembali fungsi.

Ekspresi reguler yang memvalidasi token otorisasi sebelum fungsi dipanggil dapat ditentukan jika diinginkan. Ekspresi reguler ini digunakan untuk memvalidasi bahwa token otorisasi memiliki format yang benar sebelum fungsi Anda dipanggil. Setiap permintaan menggunakan token yang tidak cocok dengan ekspresi reguler ini akan ditolak secara otomatis.

Fungsi Lambda yang digunakan untuk otorisasi memerlukan kebijakan utama appsync.amazonaws.com untuk diterapkan pada mereka untuk memungkinkan AWS AppSync untuk memanggil mereka. Tindakan ini dilakukan secara otomatis di AWS AppSync konsol; AWS AppSync Konsol tidak menghapus kebijakan. Untuk informasi selengkapnya tentang melampirkan kebijakan ke fungsi Lambda, lihat Kebijakan berbasis sumber daya di Panduan Pengembang. AWS Lambda

Fungsi Lambda yang Anda tentukan akan menerima acara dengan bentuk berikut:

{ "authorizationToken": "ExampleAUTHtoken123123123", "requestContext": { "apiId": "aaaaaa123123123example123", "accountId": "111122223333", "requestId": "f4081827-1111-4444-5555-5cf4695f339f", "queryString": "mutation CreateEvent {...}\n\nquery MyQuery {...}\n", "operationName": "MyQuery", "variables": {} } "requestHeaders": { application request headers } }

eventObjek berisi header yang dikirim dalam permintaan dari klien aplikasi ke AWS AppSync.

Fungsi otorisasi harus mengembalikan setidaknyaisAuthorized, boolean yang menunjukkan jika permintaan diotorisasi. AWS AppSync mengenali kunci berikut yang dikembalikan dari fungsi otorisasi Lambda:

catatan

Nilai untuk operasi operationName in requestContext for a WebSocket connect diatur oleh AWS AppSync ke "DeepDish:Connect”.

isAuthorized(boolean, diperlukan)

Nilai boolean yang menunjukkan apakah nilai di authorizationToken diotorisasi untuk melakukan panggilan ke API GraphQL.

Jika nilai ini benar, eksekusi GraphQL berlanjutAPI. Jika nilai ini salah, an UnauthorizedException dinaikkan

deniedFields(daftar string, opsional)

Daftar yang secara paksa diubah menjadinull, bahkan jika nilai dikembalikan dari resolver.

Setiap item adalah bidang yang sepenuhnya memenuhi syarat ARN dalam bentuk arn:aws:appsync:us-east-1:111122223333:apis/GraphQLApiId/types/TypeName/fields/FieldName atau bentuk pendekTypeName.FieldName. ARNFormulir lengkap harus digunakan ketika dua APIs berbagi otorisasi fungsi Lambda dan mungkin ada ambiguitas antara tipe dan bidang umum di antara keduanya. APIs

resolverContext(JSONObjek, opsional)

JSONObjek terlihat seperti $ctx.identity.resolverContext pada template resolver. Misalnya, jika struktur berikut dikembalikan oleh resolver:

{ "isAuthorized":true "resolverContext": { "banana":"very yellow", "apple":"very green" } }

Nilai ctx.identity.resolverContext.apple dalam template resolver akan menjadi "”very green. resolverContextObjek hanya mendukung pasangan kunci-nilai. Kunci bersarang tidak didukung.

Awas

Ukuran total JSON objek ini tidak boleh melebihi 5MB.

ttlOverride(bilangan bulat, opsional)

Jumlah detik respons harus di-cache. Jika tidak ada nilai yang dikembalikan, nilai dari yang API digunakan. Jika ini 0, responsnya tidak di-cache.

Otorisasi Lambda memiliki batas waktu 10 detik. Kami merekomendasikan merancang fungsi untuk dijalankan dalam waktu sesingkat mungkin untuk menskalakan kinerja AndaAPI.

Beberapa AWS AppSync APIs dapat berbagi fungsi Lambda otentikasi tunggal. Penggunaan otorisasi lintas akun tidak diizinkan.

Saat berbagi fungsi otorisasi di antara beberapaAPIs, ketahuilah bahwa nama bidang bentuk pendek (typename.fieldname) mungkin secara tidak sengaja menyembunyikan bidang. Untuk membedakan bidang dideniedFields, Anda dapat menentukan bidang yang tidak ambigu ARN dalam bentuk. arn:aws:appsync:region:accountId:apis/GraphQLApiId/types/typeName/fields/fieldName

Untuk menambahkan fungsi Lambda sebagai mode otorisasi default di: AWS AppSync

Console
  1. Masuk ke AWS AppSync Konsol dan arahkan ke yang ingin API Anda perbarui.

  2. Arahkan ke halaman Pengaturan untuk AndaAPI.

    Ubah otorisasi API -Level menjadi. AWS Lambda

  3. Pilih Wilayah AWS dan Lambda ARN untuk mengotorisasi panggilan API terhadap.

    catatan

    Kebijakan utama yang sesuai akan ditambahkan secara otomatis, memungkinkan AWS AppSync untuk memanggil fungsi Lambda Anda.

  4. Secara opsional, atur ekspresi reguler respons TTL dan validasi token.

AWS CLI
  1. Lampirkan kebijakan berikut ke fungsi Lambda yang digunakan:

    aws lambda add-permission --function-name "my-function" --statement-id "appsync" --principal appsync.amazonaws.com --action lambda:InvokeFunction --output text
    penting

    Jika Anda ingin kebijakan fungsi dikunci ke API GraphQL tunggal, Anda dapat menjalankan perintah ini:

    aws lambda add-permission --function-name “my-function” --statement-id “appsync” --principal appsync.amazonaws.com --action lambda:InvokeFunction --source-arn “<my AppSync API ARN>” --output text
  2. Perbarui Anda AWS AppSync API untuk menggunakan fungsi Lambda yang diberikan ARN sebagai otorisasi:

    aws appsync update-graphql-api --api-id example2f0ur2oid7acexample --name exampleAPI --authentication-type AWS_LAMBDA --lambda-authorizer-config authorizerUri="arn:aws:lambda:us-east-2:111122223333:function:my-function"
    catatan

    Anda juga dapat menyertakan opsi konfigurasi lain seperti ekspresi reguler token.

Contoh berikut menjelaskan fungsi Lambda yang menunjukkan berbagai otentikasi dan status kegagalan yang dapat dimiliki fungsi Lambda saat digunakan sebagai mekanisme otorisasi: AWS AppSync

def handler(event, context): # This is the authorization token passed by the client token = event.get('authorizationToken') # If a lambda authorizer throws an exception, it will be treated as unauthorized. if 'Fail' in token: raise Exception('Purposefully thrown exception in Lambda Authorizer.') if 'Authorized' in token and 'ReturnContext' in token: return { 'isAuthorized': True, 'resolverContext': { 'key': 'value' } } # Authorized with no f if 'Authorized' in token: return { 'isAuthorized': True } # Partial authorization if 'Partial' in token: return { 'isAuthorized': True, 'deniedFields':['user.favoriteColor'] } if 'NeverCache' in token: return { 'isAuthorized': True, 'ttlOverride': 0 } if 'Unauthorized' in token: return { 'isAuthorized': False } # if nothing is returned, then the authorization fails. return {}

Menghindari SigV4 dan batasan otorisasi token OIDC

Metode berikut dapat digunakan untuk menghindari masalah tidak dapat menggunakan tanda tangan atau OIDC token SigV4 Anda sebagai token otorisasi Lambda Anda ketika mode otorisasi tertentu diaktifkan.

Jika Anda ingin menggunakan tanda tangan SigV4 sebagai token otorisasi Lambda saat mode AWS_IAM dan AWS_LAMBDA otorisasi diaktifkan untuk AWS AppSync's, lakukan hal berikut: API

  • Untuk membuat token otorisasi Lambda baru, tambahkan sufiks dan/atau awalan acak ke tanda tangan SigV4.

  • Untuk mengambil tanda tangan SiGv4 asli, perbarui fungsi Lambda Anda dengan menghapus awalan acak dan/atau sufiks dari token otorisasi Lambda. Kemudian, gunakan tanda tangan SiGv4 asli untuk otentikasi.

Jika Anda ingin menggunakan OIDC token sebagai token otorisasi Lambda saat mode otorisasi atau mode OPENID_CONNECT otorisasi AMAZON_COGNITO_USER_POOLS dan AWS_LAMBDA diaktifkan untuk AWS AppSync'sAPI, lakukan hal berikut:

  • Untuk membuat token otorisasi Lambda baru, tambahkan sufiks dan/atau awalan acak ke token. OIDC Token otorisasi Lambda tidak boleh berisi awalan skema Pembawa.

  • Untuk mengambil OIDC token asli, perbarui fungsi Lambda Anda dengan menghapus awalan dan/atau sufiks acak dari token otorisasi Lambda. Kemudian, gunakan OIDC token asli untuk otentikasi.

AWS_IAMotorisasi

Jenis otorisasi ini memberlakukan proses penandatanganan versi AWS tanda tangan 4 pada GraphQL. API Anda dapat mengaitkan kebijakan akses Identity and Access Management (IAM) dengan jenis otorisasi ini. Aplikasi Anda dapat memanfaatkan asosiasi ini dengan menggunakan kunci akses (yang terdiri dari ID kunci akses dan kunci akses rahasia) atau dengan menggunakan kredensi sementara yang berumur pendek yang disediakan oleh Amazon Cognito Federated Identities.

Jika Anda menginginkan peran yang memiliki akses untuk melakukan semua operasi data:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/*" ] } ] }

Anda dapat menemukan YourGraphQLApiId dari halaman API daftar utama di AppSync konsol, langsung di bawah nama AndaAPI. Atau Anda dapat mengambilnya dengan: CLI aws appsync list-graphql-apis

Jika Anda ingin membatasi akses ke operasi GraphQL tertentu saja, Anda dapat melakukan ini untuk Query rootMutation,, dan bidang. Subscription

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-1>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/<Field-2>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Mutation/fields/<Field-1>", "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Subscription/fields/<Field-1>" ] } ] }

Misalnya, Anda memiliki skema berikut dan Anda ingin membatasi akses untuk mendapatkan semua posting:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { addPost(id:ID!, title:String!):Post! }

IAMKebijakan terkait untuk peran (yang dapat Anda lampirkan ke kumpulan identitas Amazon Cognito, misalnya) akan terlihat seperti berikut:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "appsync:GraphQL" ], "Resource": [ "arn:aws:appsync:us-west-2:123456789012:apis/YourGraphQLApiId/types/Query/fields/posts" ] } ] }

OPENID_CONNECT otorisasi

Jenis otorisasi ini memberlakukan token openID connect (OIDC) yang disediakan oleh layanan -compliant. OIDC Aplikasi Anda dapat memanfaatkan pengguna dan hak istimewa yang ditentukan oleh OIDC penyedia Anda untuk mengontrol akses.

Penerbit URL adalah satu-satunya nilai konfigurasi wajib yang Anda berikan AWS AppSync (misalnya,https://auth.example.com). Ini URL harus bisa ditangani. HTTPS AWS AppSync menambahkan /.well-known/openid-configuration ke penerbit URL dan menempatkan konfigurasi OpenID sesuai spesifikasi OpenID Connect https://auth.example.com/.well-known/openid-configuration Discovery. Ia mengharapkan untuk mengambil JSON dokumen yang RFC5785sesuai pada saat ini. URL JSONDokumen ini harus berisi jwks_uri kunci, yang menunjuk ke dokumen JSON Web Key Set (JWKS) dengan kunci penandatanganan. AWS AppSync membutuhkan JWKS untuk memuat JSON bidang kty dankid.

AWS AppSync mendukung berbagai algoritma penandatanganan.

Algoritme penandatanganan
RS256
RS384
RS512
PS256
PS384
PS512
HS256
HS384
HS512
ES256
ES384
ES512

Kami menyarankan Anda menggunakan RSA algoritme. Token yang dikeluarkan oleh penyedia harus mencakup waktu di mana token dikeluarkan (iat) dan dapat mencakup waktu di mana token tersebut diautentikasi (auth_time). Anda dapat memberikan TTL nilai untuk waktu yang dikeluarkan (iatTTL) dan waktu otentikasi (authTTL) dalam konfigurasi OpenID Connect untuk validasi tambahan. Jika penyedia Anda mengotorisasi beberapa aplikasi, Anda juga dapat memberikan ekspresi reguler (clientId) yang digunakan untuk mengotorisasi oleh ID klien. Ketika clientId ada dalam konfigurasi OpenID Connect Anda, AWS AppSync validasi klaim dengan mewajibkan clientId untuk mencocokkan dengan azp klaim aud atau dalam token.

Untuk memvalidasi beberapa klien, IDs gunakan operator pipeline (“|”) yang merupakan “atau” dalam ekspresi reguler. Misalnya, jika OIDC aplikasi Anda memiliki empat klien dengan klien IDs seperti 0A1S2D, 1F4G9H, 1J6L4B, 6, untuk memvalidasi hanya tiga klien pertama, Anda akan menempatkan 1F4G9H | 1J6L4B|6 GS5MG di bidang ID klien. IDs GS5MG

AMAZON_COGNITO_USER_POOLS otorisasi

Jenis otorisasi ini memberlakukan OIDC token yang disediakan oleh Amazon Cognito User Pools. Aplikasi Anda dapat memanfaatkan pengguna dan grup di pool pengguna dan kumpulan pengguna dari AWS akun lain dan mengaitkannya dengan bidang GraphQL untuk mengontrol akses.

Saat menggunakan Kumpulan Pengguna Amazon Cognito, Anda dapat membuat grup yang menjadi milik pengguna. Informasi ini dikodekan dalam JWT token yang dikirimkan aplikasi Anda AWS AppSync di header otorisasi saat mengirim operasi GraphQL. Anda dapat menggunakan arahan GraphQL pada skema untuk mengontrol grup mana yang dapat memanggil resolver mana di lapangan, sehingga memberikan akses yang lebih terkontrol ke pelanggan Anda.

Misalnya, Anda memiliki skema GraphQL berikut:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { addPost(id:ID!, title:String!):Post! } ...

Jika Anda memiliki dua grup di Amazon Cognito User Pools - blogger dan pembaca - dan Anda ingin membatasi pembaca sehingga mereka tidak dapat menambahkan entri baru, maka skema Anda akan terlihat seperti ini:

schema { query: Query mutation: Mutation }
type Query { posts:[Post!]! @aws_auth(cognito_groups: ["Bloggers", "Readers"]) } type Mutation { addPost(id:ID!, title:String!):Post! @aws_auth(cognito_groups: ["Bloggers"]) } ...

Perhatikan bahwa Anda dapat menghilangkan @aws_auth arahan jika Anda ingin default ke grant-or-deny strategi akses tertentu. Anda dapat menentukan grant-or-deny strategi dalam konfigurasi kumpulan pengguna saat membuat API GraphQL melalui konsol atau melalui perintah berikut: CLI

$ aws appsync --region us-west-2 create-graphql-api --authentication-type AMAZON_COGNITO_USER_POOLS --name userpoolstest --user-pool-config '{ "userPoolId":"test", "defaultEffect":"ALLOW", "awsRegion":"us-west-2"}'

Menggunakan mode otorisasi tambahan

Saat Anda menambahkan mode otorisasi tambahan, Anda dapat langsung mengonfigurasi pengaturan otorisasi di API tingkat AWS AppSync GraphQL (yaitu, authenticationType bidang yang dapat Anda konfigurasikan langsung pada GraphqlApi objek) dan bertindak sebagai default pada skema. Ini berarti bahwa jenis apa pun yang tidak memiliki arahan khusus harus melewati pengaturan otorisasi API level.

Pada tingkat skema, Anda dapat menentukan mode otorisasi tambahan menggunakan arahan pada skema. Anda dapat menentukan mode otorisasi pada bidang individual dalam skema. Misalnya, untuk API_KEY otorisasi yang akan Anda gunakan @aws_api_key pada definisi/bidang tipe objek skema. Arahan berikut didukung pada bidang skema dan definisi tipe objek:

  • @aws_api_key- Untuk menentukan bidang API_KEY diotorisasi.

  • @aws_iam- Untuk menentukan bahwa bidang tersebut AWS_IAM diotorisasi.

  • @aws_oidc- Untuk menentukan bahwa bidang tersebut OPENID_CONNECT diotorisasi.

  • @aws_cognito_user_pools- Untuk menentukan bahwa bidang tersebut AMAZON_COGNITO_USER_POOLS diotorisasi.

  • @aws_lambda- Untuk menentukan bahwa bidang tersebut AWS_LAMBDA diotorisasi.

Anda tidak dapat menggunakan @aws_auth arahan bersama dengan mode otorisasi tambahan. @aws_authhanya berfungsi dalam konteks AMAZON_COGNITO_USER_POOLS otorisasi tanpa mode otorisasi tambahan. Namun, Anda dapat menggunakan @aws_cognito_user_pools direktif sebagai pengganti @aws_auth direktif, menggunakan argumen yang sama. Perbedaan utama antara keduanya adalah bahwa Anda dapat menentukan @aws_cognito_user_pools pada setiap bidang dan definisi jenis objek.

Untuk memahami bagaimana mode otorisasi tambahan bekerja dan bagaimana mereka dapat ditentukan pada skema, mari kita lihat skema berikut:

schema { query: Query mutation: Mutation } type Query { getPost(id: ID): Post getAllPosts(): [Post] @aws_api_key } type Mutation { addPost( id: ID! author: String! title: String! content: String! url: String! ): Post! } type Post @aws_api_key @aws_iam { id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! } ...

Untuk skema ini, asumsikan bahwa AWS_IAM adalah jenis otorisasi default pada AWS AppSync GraphQL. API Ini berarti bahwa bidang yang tidak memiliki arahan dilindungi menggunakanAWS_IAM. Misalnya, itulah kasus untuk getPost bidang pada Query tipe. Arahan skema memungkinkan Anda untuk menggunakan lebih dari satu mode otorisasi. Misalnya, Anda dapat API_KEY mengonfigurasi sebagai mode otorisasi tambahan pada AWS AppSync API GraphQL, dan Anda dapat menandai bidang menggunakan arahan (misalnya, @aws_api_key dalam contoh getAllPosts ini). Arahan bekerja di tingkat lapangan sehingga Anda perlu memberikan API_KEY akses ke Post jenis juga. Anda dapat melakukan ini dengan menandai setiap bidang dalam Post tipe dengan direktif, atau dengan menandai Post tipe dengan @aws_api_key direktif.

Untuk lebih membatasi akses ke bidang dalam Post jenis, Anda dapat menggunakan arahan terhadap bidang individual dalam Post jenis seperti yang ditunjukkan berikut.

Misalnya, Anda dapat menambahkan restrictedContent bidang ke Post jenis dan membatasi akses ke sana dengan menggunakan @aws_iam direktif. AWS_IAMPermintaan yang diautentikasi dapat mengaksesrestrictedContent, namun API_KEY permintaan tidak akan dapat mengaksesnya.

type Post @aws_api_key @aws_iam{ id: ID! author: String title: String content: String url: String ups: Int! downs: Int! version: Int! restrictedContent: String! @aws_iam } ...

Kontrol akses detail

Informasi sebelumnya menunjukkan cara membatasi atau memberikan akses ke bidang GraphQL tertentu. Jika Anda ingin mengatur kontrol akses pada data berdasarkan kondisi tertentu (misalnya, berdasarkan pengguna yang melakukan panggilan dan apakah pengguna memiliki data), Anda dapat menggunakan templat pemetaan di resolver Anda. Anda juga dapat melakukan logika bisnis yang lebih kompleks, yang kami jelaskan dalam Memfilter Informasi.

Bagian ini menunjukkan cara mengatur kontrol akses pada data Anda menggunakan template pemetaan DynamoDB resolver.

Sebelum melanjutkan lebih jauh, jika Anda tidak terbiasa dengan template pemetaan di AWS AppSync, Anda mungkin ingin meninjau referensi template pemetaan Resolver dan referensi template pemetaan Resolver untuk DynamoDB.

Dalam contoh berikut menggunakan DynamoDB, misalkan Anda menggunakan skema posting blog sebelumnya, dan hanya pengguna yang membuat posting yang diizinkan untuk mengeditnya. Proses evaluasi akan bagi pengguna untuk mendapatkan kredensil dalam aplikasi mereka, menggunakan Amazon Cognito User Pools misalnya, dan kemudian meneruskan kredensil ini sebagai bagian dari operasi GraphQL. Template pemetaan kemudian akan menggantikan nilai dari kredensional (seperti nama pengguna) dalam pernyataan bersyarat yang kemudian akan dibandingkan dengan nilai dalam database Anda.

Diagram showing authentication flow from user login to database operation using Layanan AWS.

Untuk menambahkan fungsionalitas ini, tambahkan bidang editPost GraphQL sebagai berikut:

schema { query: Query mutation: Mutation } type Query { posts:[Post!]! } type Mutation { editPost(id:ID!, title:String, content:String):Post addPost(id:ID!, title:String!):Post! } ...

Template pemetaan resolver untuk editPost (ditampilkan dalam contoh di akhir bagian ini) perlu melakukan pemeriksaan logis terhadap penyimpanan data Anda untuk mengizinkan hanya pengguna yang membuat posting untuk mengeditnya. Karena ini adalah operasi edit, ini sesuai dengan DynamoDB UpdateItem di. Anda dapat melakukan pemeriksaan bersyarat sebelum melakukan tindakan ini, menggunakan konteks yang diteruskan untuk validasi identitas pengguna. Ini disimpan dalam Identity objek yang memiliki nilai-nilai berikut:

{ "accountId" : "12321434323", "cognitoIdentityPoolId" : "", "cognitoIdentityId" : "", "sourceIP" : "", "caller" : "ThisistheprincipalARN", "username" : "username", "userArn" : "Sameasabove" }

Untuk menggunakan objek ini dalam panggilan UpdateItem DynamoDB, Anda perlu menyimpan informasi identitas pengguna dalam tabel untuk perbandingan. Pertama, addPost mutasi Anda perlu menyimpan pencipta. Kedua, editPost mutasi Anda perlu melakukan pemeriksaan bersyarat sebelum memperbarui.

Berikut adalah contoh kode resolver addPost yang menyimpan identitas pengguna sebagai Author kolom:

import { util, Context } from '@aws-appsync/utils'; import { put } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id: postId, ...item } = ctx.args; return put({ key: { postId }, item: { ...item, Author: ctx.identity.username }, condition: { postId: { attributeExists: false } }, }); } export const response = (ctx) => ctx.result;

Perhatikan bahwa Author atribut diisi dari Identity objek, yang berasal dari aplikasi.

Terakhir, berikut adalah contoh kode resolver untukeditPost, yang hanya memperbarui konten posting blog jika permintaan berasal dari pengguna yang membuat posting:

import { util, Context } from '@aws-appsync/utils'; import { put } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { const { id, ...item } = ctx.args; return put({ key: { id }, item, condition: { author: { contains: ctx.identity.username } }, }); } export const response = (ctx) => ctx.result;

Contoh ini menggunakan a PutItem yang menimpa semua nilai daripadaUpdateItem, tetapi konsep yang sama berlaku pada blok condition pernyataan.

Informasi penyaringan

Mungkin ada kasus di mana Anda tidak dapat mengontrol respons dari sumber data Anda, tetapi Anda tidak ingin mengirim informasi yang tidak perlu kepada klien saat berhasil menulis atau membaca ke sumber data. Dalam kasus ini, Anda dapat memfilter informasi dengan menggunakan template pemetaan respons.

Misalnya, Anda tidak memiliki indeks yang sesuai pada tabel DynamoDB posting blog Anda (seperti indeks pada). Author Anda dapat menggunakan resolver berikut:

import { util, Context } from '@aws-appsync/utils'; import { get } from '@aws-appsync/utils/dynamodb'; export function request(ctx) { return get({ key: { ctx.args.id } }); } export function response(ctx) { if (ctx.result.author === ctx.identity.username) { return ctx.result; } return null; }

Handler permintaan mengambil item bahkan jika pemanggil bukan penulis yang membuat posting. Untuk mencegah hal ini mengembalikan semua data, penangan respons memeriksa untuk memastikan pemanggil cocok dengan penulis item. Jika pemanggil tidak cocok dengan pemeriksaan ini, hanya respons nol yang dikembalikan.

Akses sumber data

AWS AppSync berkomunikasi dengan sumber data menggunakan peran Identity and Access Management (IAM) dan kebijakan akses. Jika Anda menggunakan peran yang ada, Kebijakan Kepercayaan perlu ditambahkan AWS AppSync agar dapat mengambil peran tersebut. Hubungan kepercayaan akan terlihat seperti di bawah ini:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "appsync.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }

Penting untuk mengurangi kebijakan akses pada peran agar hanya memiliki izin untuk bertindak berdasarkan kumpulan sumber daya minimal yang diperlukan. Saat menggunakan AppSync konsol untuk membuat sumber data dan membuat peran, ini dilakukan secara otomatis untuk Anda. Namun saat menggunakan templat sampel bawaan dari IAM konsol untuk membuat peran di luar AWS AppSync konsol, izin tidak akan dicakup secara otomatis pada sumber daya dan Anda harus melakukan tindakan ini sebelum memindahkan aplikasi ke produksi.