Otorisasi dan otentikasi - AWS AppSync

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

Otorisasi dan otentikasi

Bagian ini menjelaskan opsi untuk mengonfigurasi keamanan dan perlindungan data untuk aplikasi Anda.

Jenis otorisasi

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

  • API_KEY

    Untuk menggunakan kunci API.

  • 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.

Otorisasi API_KEY

API yang tidak diautentikasi memerlukan pembatasan yang lebih ketat daripada API yang diautentikasi. Salah satu cara untuk mengontrol pelambatan untuk titik akhir GraphQL yang tidak diautentikasi adalah melalui penggunaan kunci API. Kunci API 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 kunci API dari konsol, dari CLI, atau dari referensi AWS AppSync API.

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

    1. Di dasbor API, pilih GraphQL API Anda.

    2. Di Sidebar, pilih Pengaturan.

  2. Di bawah mode otorisasi default, pilih kunci API.

  3. Dalam tabel kunci API, pilih Tambahkan kunci API.

    Kunci API baru akan dihasilkan dalam tabel.

    1. Untuk menghapus kunci API lama, pilih kunci API di tabel lalu pilih Hapus.

  4. Pilih Simpan di bagian bawah halaman.

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

  2. Buat objek GraphQL API 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 API Anda. Anda dapat menggunakan hal yang samaname.

    3. Yang authentication-type akan menjadiAPI_KEY.

    catatan

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

    Contoh perintah mungkin terlihat seperti ini:

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

    Output akan dikembalikan dalam CLI. Berikut adalah contoh di JSON:

    { "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" } }

Kunci API dapat dikonfigurasi hingga 365 hari, dan Anda dapat memperpanjang tanggal kedaluwarsa yang ada hingga 365 hari lagi sejak hari itu. Kunci API direkomendasikan untuk tujuan pengembangan atau kasus penggunaan di mana aman untuk mengekspos API publik.

Pada klien, kunci API 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

Otorisasi AWS_LAMBDA

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

  • Jika API mengaktifkan mode AWS_IAM otorisasi AWS_LAMBDA dan, 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 token OIDC tidak dapat digunakan sebagai token otorisasi. AWS_LAMBDA Perhatikan bahwa token OIDC dapat menjadi 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 ID API dan token otentikasi. Secara default, caching tidak diaktifkan, tetapi ini dapat diaktifkan pada tingkat API atau dengan menetapkan ttlOverride nilai dalam nilai pengembalian 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:

isAuthorized(boolean, diperlukan)

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

Jika nilai ini benar, eksekusi GraphQL API berlanjut. 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 ARN yang memenuhi syarat penuh dalam bentuk arn:aws:appsync:us-east-1:111122223333:apis/GraphQLApiId/types/TypeName/fields/FieldName atau bentuk pendek. TypeName.FieldName Formulir ARN lengkap harus digunakan ketika dua API berbagi otorisasi fungsi Lambda dan mungkin ada ambiguitas antara tipe dan bidang umum antara dua API.

resolverContext(Objek JSON, opsional)

Sebuah objek JSON 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 objek JSON ini tidak boleh melebihi 5MB.

ttlOverride(bilangan bulat, opsional)

Jumlah detik respons harus di-cache. Jika tidak ada nilai yang dikembalikan, nilai dari API akan 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 API Anda.

Beberapa AWS AppSync API dapat berbagi satu fungsi Lambda otentikasi. Penggunaan otorisasi lintas akun tidak diizinkan.

Saat berbagi fungsi otorisasi di antara beberapa API, ketahuilah bahwa nama bidang bentuk pendek (typename.fieldname) mungkin secara tidak sengaja menyembunyikan bidang. Untuk membedakan bidang dideniedFields, Anda dapat menentukan bidang ARN yang tidak ambigu 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 navigasikan ke API yang ingin Anda perbarui.

  2. Arahkan ke halaman Pengaturan untuk API Anda.

    Ubah otorisasi tingkat API 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 respons TTL dan ekspresi reguler 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 satu GraphQL API, 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 AWS AppSync API Anda untuk menggunakan ARN fungsi Lambda yang diberikan 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 batasan otorisasi token SiGv4 dan OIDC

Metode berikut dapat digunakan untuk menghindari masalah tidak dapat menggunakan tanda tangan SigV4 atau token OIDC 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 API, lakukan AWS AppSync hal berikut:

  • 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 token OIDC sebagai token otorisasi Lambda saat mode otorisasi atau mode OPENID_CONNECT otorisasi AMAZON_COGNITO_USER_POOLS dan diaktifkan untuk AWS_LAMBDA AWS AppSync API, 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 token OIDC asli, perbarui fungsi Lambda Anda dengan menghapus awalan acak dan/atau sufiks dari token otorisasi Lambda. Kemudian, gunakan token OIDC asli untuk otentikasi.

Otorisasi AWS_IAM

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 daftar API utama di AppSync konsol, langsung di bawah nama API Anda. 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! }

Kebijakan IAM terkait untuk suatu 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" ] } ] }

Otorisasi OPENID_CONNECT

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

URL Penerbit adalah satu-satunya nilai konfigurasi wajib yang Anda berikan AWS AppSync (misalnya,https://auth.example.com). URL ini harus dapat dialamatkan melalui HTTPS. AWS AppSync menambahkan /.well-known/openid-configuration ke URL penerbit dan menempatkan konfigurasi OpenID sesuai spesifikasi OpenID Connect https://auth.example.com/.well-known/openid-configuration Discovery. Ia mengharapkan untuk mengambil dokumen JSON yang sesuai dengan RFC5785 di URL ini. Dokumen JSON ini harus berisi jwks_uri kunci, yang menunjuk ke dokumen JSON Web Key Set (JWKS) dengan kunci penandatanganan. AWS AppSync mengharuskan JWKS berisi bidang JSON dan. kty kid

AWS AppSync mendukung berbagai algoritma penandatanganan.

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

Kami menyarankan Anda menggunakan algoritma RSA. Token yang dikeluarkan oleh penyedia harus mencakup waktu di mana token dikeluarkan (iat) dan dapat mencakup waktu di mana token itu diautentikasi (auth_time). Anda dapat memberikan nilai TTL 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 ID klien, gunakan operator pipeline (“|”) yang merupakan “atau” dalam ekspresi reguler. Misalnya, jika aplikasi OIDC Anda memiliki empat klien dengan ID klien seperti 0A1S2D, 1F4G9H, 1J6L4B, 6GS5MG, untuk memvalidasi hanya tiga ID klien pertama, Anda akan menempatkan 1F4G9H | 1J6L4B | 6GS5MG di bidang ID klien.

Otorisasi AMAZON_COGNITO_USER_POOLS

Jenis otorisasi ini memberlakukan token OIDC yang disediakan oleh Amazon Cognito User Pools. Aplikasi Anda dapat memanfaatkan pengguna dan grup di kumpulan pengguna Anda 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 token JWT yang dikirimkan aplikasi Anda AWS AppSync dalam 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 GraphQL API melalui konsol atau melalui perintah CLI berikut:

$ 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 level API 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 tingkat API.

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 itu 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 GraphQL API, 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.

Untuk menambahkan fungsi 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.

Memfilter informasi

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 konsol IAM 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.