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 API Anda
AWS AppSync menawarkan jenis otorisasi berikut untuk mengamankan GraphQL API: kunci API, Lambda, IAM, OpenID Connect, dan Cognito User Pools. Setiap opsi menyediakan metode keamanan yang berbeda:
-
Otorisasi Kunci API: Mengontrol pelambatan untuk API yang tidak diautentikasi, menyediakan opsi keamanan sederhana.
-
Otorisasi Lambda: Mengaktifkan logika otorisasi khusus, menjelaskan input dan output fungsi secara rinci.
-
Otorisasi IAM: Mem AWS anfaatkan proses penandatanganan tanda tangan versi 4, memungkinkan kontrol akses yang halus melalui kebijakan IAM.
-
OpenID Connect Authorization: Terintegrasi dengan OIDC-compliant layanan untuk otentikasi pengguna.
-
Kumpulan Pengguna Cognito: Mengimplementasikan kontrol akses berbasis grup menggunakan fitur manajemen pengguna Cognito.
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 AWS AppSync API 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 menyediakan jenis otorisasi yang mengambil nilai-nilai yang tercantum di atas (yaituAPI_KEY,AWS_LAMBDA,AWS_IAM,OPENID_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 menduplik AWS_LAMBDA asiAPI_KEY, atau AWS_IAM di dalam mode otorisasi tambahan. Anda dapat menggunakan beberapa Amazon Cognito User Pool 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 Amazon Cognito User Pool atau penyedia OpenID Connect menggunakan ekspresi reguler konfigurasi yang sesuai.
Saat Anda menyimpan perubahan pada konfigurasi API Anda, AWS AppSync mulailah menyebarkan perubahan. Sampai perubahan konfigurasi Anda disebarkan, AWS AppSync terus menyajikan konten Anda dari konfigurasi sebelumnya. Setelah perubahan konfigurasi Anda disebarkan, AWS AppSync segera mulai menyajikan konten Anda berdasarkan konfigurasi baru. Saat AWS AppSync menyebarkan perubahan Anda untuk API, kami tidak dapat menentukan apakah API melayani konten Anda berdasarkan konfigurasi sebelumnya atau konfigurasi baru.
Otorisasi API_KEY
API yang tidak diautentikasi memerlukan pembatasan yang lebih ketat daripada API yang diautentikasi. Salah satu cara untuk mengontrol throttling untuk titik akhir GraphQL yang tidak diautentikasi adalah melalui penggunaan kunci API. Kunci API adalah nilai hardcode 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.
Kunci API dapat dikonfigurasi hingga 365 hari, dan Anda dapat memperpanjang tanggal kedaluwarsa yang ada hingga 365 hari lagi dari 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 GraphQL melalui curl 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_LAMBDAdanAWS_IAMotorisasi, maka tanda tangan SIGv4 tidak dapat digunakan sebagai tokenAWS_LAMBDAotorisasi. -
Jika API mengaktifkan mode
OPENID_CONNECTotorisasiAWS_LAMBDAdan atau modeAMAZON_COGNITO_USER_POOLSotorisasi, maka token OIDC tidak dapat digunakan sebagai tokenAWS_LAMBDAotorisasi. Perhatikan bahwa token OIDC dapat berupa skema Pembawa. -
Fungsi Lambda tidak boleh mengembalikan lebih dari 5MB data kontekstual untuk resolver.
Misalnya, jika token otorisasi Anda adalah'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. Ketika respons otorizer Lambda kurang dari 1.048.576 byte, AWS AppSync cache respons untuk permintaan berikutnya. Jika respons otorizer Lambda sama dengan atau lebih besar dari 1.048.576 byte, AWS AppSync tidak menyimpan respons dan memanggil otorisasi Lambda untuk setiap permintaan masuk. Untuk mengoptimalkan kinerja dan meminimalkan biaya pemanggilan Lambda, sebaiknya batasi respons otorizer Lambda menjadi 1.048.576 byte. Secara default, caching tidak diaktifkan, tetapi ini dapat diaktifkan di tingkat API atau dengan mengatur 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 AWS AppSync untuk memungkinkan memanggilnya. Tindakan ini dilakukan secara otomatis di AWS AppSync AWS AppSync konsol; Konsol tidak menghapus kebijakan. Untuk informasi selengkapnya tentang melampirkan kebijakan ke fungsi Lambda, lihat Resource-based kebijakan di Panduan Peng AWS Lambda embang.
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} }
Ob event jek berisi header yang dikirim dalam permintaan dari klien aplikasi ke AWS AppSync.
Fungsi otorisasi harus mengembalikan setidaknyaisAuthorized, boolean yang menunjukkan apakah permintaan diotorisasi. AWS AppSync mengenali kunci berikut yang dikembalikan dari fungsi otorisasi Lambda:
catatan
Nilai untuk operasi operationName dalam requestContext untuk WebSocket koneksi diatur oleh AWS AppSync "DeepDish:Connect”.
isAuthorized(boolean, diperlukan)-
Nilai boolean yang menunjukkan apakah nilai di
authorizationTokendiotorisasi untuk melakukan panggilan ke GraphQL API.Jika nilai ini benar, eksekusi GraphQL API berlanjut. Jika nilai ini salah, an din
UnauthorizedExceptionaikkan deniedFields(daftar string, opsional)-
Daftar yang secara paksa diubah menjadi
null, bahkan jika nilai dikembalikan dari resolver.Setiap item adalah ARN bidang yang sepenuhnya memenuhi syarat dalam bentuk
arn:aws:appsync:atau bentuk singkat darius-east-1:111122223333:apis/GraphQLApiId/types/TypeName/fields/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.TypeName.FieldName resolverContext(Objek JSON, opsional)-
Objek JSON terlihat seperti
$ctx.identity.resolverContextpada templat resolver. Misalnya, jika struktur berikut dikembalikan oleh resolver:{ "isAuthorized":true "resolverContext": { "banana":"very yellow", "apple":"very green" } }Nilai templ
ctx.identity.resolverContext.appleat resolver adalah "very green”. ObresolverContextjek hanya mendukung pasangan kunci-nilai. Kunci bersarang tidak didukung.Awas
Ukuran total objek JSON ini tidak boleh melebihi 5MB.
ttlOverride(integer, opsional)-
Jumlah detik respon harus di-cache. Jika tidak ada nilai yang dikembalikan, nilai dari API digunakan. Jika ini adalah 0, respons tidak di-cache.
Otorisasi Lambda memiliki batas waktu standar 10 detik tetapi mungkin habis lebih awal dalam kondisi lalu lintas puncak. Kami merekomendasikan merancang fungsi untuk dijalankan dalam waktu sesingkat mungkin (di bawah 1s) untuk meningkatkan kinerja API Anda.
Beberapa AWS AppSync API dapat berbagi fungsi Lambda otentikasi tunggal. Penggunaan otorisasi lintas akun tidak diizinkan.
Saat berbagi fungsi otorisasi antara beberapa API, ketahuilah bahwa nama bidang bentuk pendek () dapat secara tidak sengaja menyembunyikan bidang. Untuk memisahkan bidang ditypename.fieldnamedeniedFields, 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
Contoh berikut menjelaskan fungsi Lambda yang menunjukkan berbagai status otentikasi dan kegagalan fungsi Lambda yang dapat dimiliki ketika digunakan sebagai mekanisme AWS AppSync otorisasi:
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_LAMBDA otorisasi AWS_IAM dan diaktifkan untuk AWS AppSync API, lakukan hal berikut:
-
Untuk membuat token otorisasi Lambda baru, tambahkan awalan akhiran acak ke tanda and/or tangan SIGv4.
-
Untuk mengambil tanda tangan SigV4 asli, perbarui fungsi Lambda Anda dengan menghapus akhiran awalan acak dari token otor and/or isasi Lambda. Kemudian, gunakan tanda tangan SIGv4 asli untuk otentikasi.
Jika Anda ingin menggunakan token OIDC sebagai token otorisasi Lambda saat mode OPENID_CONNECT otorisasi atau mode AWS_LAMBDA otorisasi AMAZON_COGNITO_USER_POOLS dan diaktifkan untuk AWS AppSync API, lakukan hal berikut:
-
Untuk membuat token otorisasi Lambda baru, tambahkan awalan akhiran acak ke token and/or OIDC. Token otorisasi Lambda tidak boleh berisi awalan skema Pembawa.
-
Untuk mengambil token OIDC asli, perbarui fungsi Lambda Anda dengan menghapus akhiran awalan acak dari token otor and/or isasi Lambda. Kemudian, gunakan token OIDC asli untuk otentikasi.
Otorisasi AWS_IAM
Jenis otorisasi ini memberlakukan proses penandatanganan AWS tanda tangan versi 4 pada GraphQL API. Anda dapat mengaitkan kebijakan akses Manajemen Identitas dan Akses (IAM
Jika Anda menginginkan peran yang memiliki akses untuk melakukan semua operasi data:
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 hanya ke operasi GraphQL tertentu, Anda dapat melakukan ini untuk rootQuery,Mutation, dan Subscription bidang.
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 yang sesuai untuk peran (yang dapat Anda lampirkan ke kumpulan identitas Amazon Cognito, misalnya) akan terlihat seperti berikut:
Otorisasi OPENID_CONNECT
Jenis otorisasi ini memberlakukan token OpenID connect
URL Penerbit adalah satu-satunya nilai konfigurasi yang diperlukan yang Anda berikan kepada 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 menemukan konfigurasi OpenID di https://auth.example.com/.well-known/openid-configuration sesuai spesifikasi OpenID Connect Discovery. jwks_uri kunci, yang menunjuk ke dokumen JSON Web Key Set (JWKS) dengan kunci penandatanganan. AWS AppSync membutuhkan JWKS untuk berisi bidang JSON dari kty dan. 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 menyertakan waktu di mana token dikeluarkan (iat) dan mungkin termasuk 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 Anda 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 memvalidasi klaim dengan mengharuskan klaim clientId untuk mencocokkan dengan azp klaim aud atau di 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.
Jika API dikonfigurasi dengan beberapa jenis otorisasi, AWS AppSync memvalidasi penerbit (klaim iss) yang ada di token JWT dari header permintaan dengan membandingkannya dengan URL penerbit yang ditentukan dalam konfigurasi API. Namun, ketika API dikonfigurasi hanya dengan otorisasi OPENID_CONNECT, langkah validasi URL penerbit ini AWS AppSync akan dilewati.
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 dan kumpulan pengguna dari AWS akun lain dan mengaitkannya dengan bidang GraphQL untuk mengontrol akses.
Saat menggunakan Amazon Cognito User Pools, Anda dapat membuat grup milik pengguna. Informasi ini dikodekan dalam token JWT yang dikirim 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 bidang, 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 direktif jika @aws_auth Anda ingin default ke strategi grant-or-tolak tertentu pada akses. Anda dapat menentukan strategi grant-or-deny dalam konfigurasi kumpulan pengguna saat Anda 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
Ketika Anda menambahkan mode otorisasi tambahan, Anda dapat langsung mengonfigurasi pengaturan otorisasi di level AWS AppSync GraphQL API (yaitu, authenticationType bidang yang dapat Anda konfigurasi langsung pada GraphqlApi objek) dan bertindak sebagai default pada skema. Ini berarti bahwa setiap jenis yang tidak memiliki direktif tertentu 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 tipe objek skema definitions/fields. Arahan berikut didukung pada bidang skema dan definisi tipe objek:
-
@aws_api_key- Untuk menentukan bidang yang diAPI_KEYotorisasi. -
@aws_iam- Untuk menentukan bahwa bidang tersebut diAWS_IAMotorisasi. -
@aws_oidc- Untuk menentukan bahwa bidang tersebut diOPENID_CONNECTotorisasi. -
@aws_cognito_user_pools- Untuk menentukan bahwa bidang tersebut diAMAZON_COGNITO_USER_POOLSotorisasi. -
@aws_lambda- Untuk menentukan bahwa bidang tersebut diAWS_LAMBDAotorisasi.
Anda tidak dapat menggunakan direk @aws_auth tif bersama dengan mode otorisasi tambahan. @aws_authbekerja hanya dalam konteks AMAZON_COGNITO_USER_POOLS otorisasi tanpa mode otorisasi tambahan. Namun, Anda dapat menggunakan direk @aws_cognito_user_pools tif sebagai pengganti direktif@aws_auth, menggunakan argumen yang sama. Perbedaan utama antara keduanya adalah bahwa Anda dapat menentukan @aws_cognito_user_pools pada bidang dan definisi tipe objek apa pun.
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 itu AWS_IAM adalah tipe otorisasi default pada AWS AppSync GraphQL API. Ini berarti bahwa bidang yang tidak memiliki direktif dilindungi menggunakanAWS_IAM. Misalnya, itu kasus untuk getPost bidang pada Query tipe. Arahan skema memungkinkan Anda untuk menggunakan lebih dari satu mode otorisasi. Misalnya, Anda dapat mengon API_KEY figurasi sebagai mode otorisasi tambahan pada AWS AppSync GraphQL API, dan Anda dapat menandai bidang menggunakan direk @aws_api_key tif (misalnya, getAllPosts dalam contoh ini). Arahan bekerja di tingkat lapangan sehingga Anda perlu memberikan API_KEY akses ke Post tipe juga. Anda dapat melakukan ini baik dengan menandai setiap bidang dalam Post tipe dengan direktif, atau dengan menandai Post tipe dengan direk @aws_api_key tif.
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 direk @aws_iam tif. 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 } ...
Fine-grained kontrol akses
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 Mem filter Informasi.
Bagian ini menunjukkan cara mengatur kontrol akses pada data Anda menggunakan template pemetaan resolver DynamoDB.
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 adalah agar pengguna mendapatkan kredenSIAL dalam aplikasi mereka, menggunakan Amazon Cognito User Pools misalnya, dan kemudian meneruskan kredenSIAL ini sebagai bagian dari operasi GraphQL. Template pemetaan kemudian akan mengganti nilai dari kredenSIAL (seperti nama pengguna) dalam pernyataan bersyarat yang kemudian akan dibandingkan dengan nilai dalam database Anda.
Untuk menambahkan fungsi ini, tambahkan bidang GraphQL editPost 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 sebuah UpdateItem di DynamoDB. Anda dapat melakukan pemeriksaan kondisional 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 UpdateItem panggilan DynamoDB, Anda perlu menyimpan informasi identitas pengguna dalam tabel untuk perbandingan. Pertama, addPost mutasi Anda perlu menyimpan penciptanya. Kedua, editPost mutasi Anda perlu melakukan pemeriksaan kondisional sebelum memperbarui.
Berikut adalah contoh kode resolver untuk addPost 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 mengganti semua nilai daripada sebuahUpdateItem, 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 ke 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 padaAuthor). 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; }
Penangan permintaan mengambil item meskipun pemanggil bukan penulis yang membuat posting. Untuk mencegah hal ini mengembalikan semua data, pengendali respons memeriksa untuk memastikan pemanggil cocok dengan penulis item. Jika penelepon 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
Penting untuk menguraikan kebijakan akses pada peran agar hanya memiliki izin untuk bertindak pada 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 template sampel bawaan dari konsol IAM untuk membuat peran di luar AWS AppSync konsol, izin tidak akan secara otomatis dicakup pada sumber daya dan Anda harus melakukan tindakan ini sebelum memindahkan aplikasi Anda ke produksi.