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:
-
APIOtorisasi Kunci: Mengontrol pembatasan untuk tidak diautentikasiAPIs, memberikan opsi keamanan sederhana.
-
Otorisasi Lambda: Mengaktifkan logika otorisasi khusus, menjelaskan input dan output fungsi secara rinci.
-
IAMOtorisasi: Memanfaatkan AWS proses penandatanganan versi 4 tanda tangan, memungkinkan kontrol akses halus melalui kebijakan. IAM
-
Otorisasi OpenID Connect: Terintegrasi dengan layanan yang OIDC sesuai untuk otentikasi pengguna.
-
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_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 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.
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
danAWS_IAM
otorisasi diaktifkan, maka tanda tangan SigV4 tidak dapat digunakan sebagai token otorisasi.AWS_LAMBDA
-
Jika API memiliki mode
AWS_LAMBDA
danOPENID_CONNECT
otorisasi atau modeAMAZON_COGNITO_USER_POOLS
otorisasi diaktifkan, maka OIDC token tidak dapat digunakan sebagai tokenAWS_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
} }
event
Objek 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 menjadi
null
, bahkan jika nilai dikembalikan dari resolver.Setiap item adalah bidang yang sepenuhnya memenuhi syarat ARN dalam bentuk
arn:aws:appsync:
atau bentuk pendekus-east-1
:111122223333
:apis/GraphQLApiId
/types/TypeName
/fields/FieldName
. ARNFormulir lengkap harus digunakan ketika dua APIs berbagi otorisasi fungsi Lambda dan mungkin ada ambiguitas antara tipe dan bidang umum di antara keduanya. APIsTypeName
.FieldName
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
.resolverContext
Objek 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 (
) mungkin secara tidak sengaja menyembunyikan bidang. Untuk membedakan bidang ditypename
.fieldname
deniedFields
, 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
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
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
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.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 bidangAPI_KEY
diotorisasi. -
@aws_iam
- Untuk menentukan bahwa bidang tersebutAWS_IAM
diotorisasi. -
@aws_oidc
- Untuk menentukan bahwa bidang tersebutOPENID_CONNECT
diotorisasi. -
@aws_cognito_user_pools
- Untuk menentukan bahwa bidang tersebutAMAZON_COGNITO_USER_POOLS
diotorisasi. -
@aws_lambda
- Untuk menentukan bahwa bidang tersebutAWS_LAMBDA
diotorisasi.
Anda tidak dapat menggunakan @aws_auth
arahan bersama dengan mode otorisasi tambahan. @aws_auth
hanya 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_IAM
Permintaan 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.
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 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
{ "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.