

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
<a name="security-authz"></a>

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: 

1. **Otorisasi Kunci API**: Mengontrol pelambatan untuk API yang tidak diautentikasi, menyediakan opsi keamanan sederhana. 

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

1. **Otorisasi IAM**: Mem AWS anfaatkan proses penandatanganan tanda tangan versi 4, memungkinkan kontrol akses yang halus melalui kebijakan IAM. 

1. **OpenID Connect Authorization**: Terintegrasi dengan OIDC-compliant layanan untuk otentikasi pengguna. 

1. **Kumpulan Pengguna Cognito**: Mengimplementasikan kontrol akses berbasis grup menggunakan fitur manajemen pengguna Cognito. 

## Jenis otorisasi
<a name="authorization-types"></a>

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](https://aws.amazon.com/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 (yaitu`API_KEY`,`AWS_LAMBDA`,`AWS_IAM`,`OPENID_CONNECT`,, dan`AMAZON_COGNITO_USER_POOLS`).

Saat Anda menentukan`API_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` asi`API_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
<a name="api-key-authorization"></a>

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](https://docs.aws.amazon.com/appsync/latest/APIReference/) API.

------
#### [ Console ]

1. Masuk ke Konsol Manajemen AWS dan buka [ AppSync konsol](https://console.aws.amazon.com/appsync/).

   1. Di dasbor ** API**, pilih GraphQL API Anda.

   1. Di ** Sidebar**, pilih Peng ** aturan**.

1. Di bawah Mode otorisasi ** default**, pilih kunci ** API**.

1. Di ** tabel kunci ** API, pilih ** Tambahkan kunci API**.

   Kunci API baru akan dihasilkan di tabel.

   1. Untuk menghapus kunci API lama, pilih kunci API di tabel lalu pilih H ** apus**.

1. 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](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-quickstart.html).

1. Buat objek API GraphQL dengan menjalankan [`update-graphql-api`](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/appsync/update-graphql-api.html) perintah.

   Anda harus mengetikkan dua parameter untuk perintah khusus ini:

   1. API GraphQL Anda. `api-id`

   1. Yang baru `name` dari API Anda. Anda dapat menggunakan yang sama`name`.

   1. Yang`authentication-type`, yang akan terjadi`API_KEY`.
**catatan**  
Ada parameter lain seperti `Region` itu 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 dalam 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 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 header`x-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
<a name="aws-lambda-authorization"></a>

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_LAMBDA` dan `AWS_IAM` otorisasi, maka tanda tangan SIGv4 tidak dapat digunakan sebagai token `AWS_LAMBDA` otorisasi.
+ Jika API mengaktifkan mode `OPENID_CONNECT` otorisasi `AWS_LAMBDA` dan atau mode `AMAZON_COGNITO_USER_POOLS` otorisasi, maka token OIDC tidak dapat digunakan sebagai token `AWS_LAMBDA` otorisasi. 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 ](https://docs.aws.amazon.com/lambda/latest/dg/access-control-resource-based.html#permissions-resource-serviceinvoke) 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 setidaknya`isAuthorized`, 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`”.

### Daftar fungsi
<a name="aws-lambda-authorization-list"></a>

`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 din `UnauthorizedException` aikkan

`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:{{us-east-1}}:{{111122223333}}:apis/{{GraphQLApiId}}/types/{{TypeName}}/fields/{{FieldName}}` atau bentuk singkat dari`{{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)  
Objek JSON terlihat seperti `$ctx.identity.resolverContext` pada templat resolver. Misalnya, jika struktur berikut dikembalikan oleh resolver:  

```
{
  "isAuthorized":true
  "resolverContext": {
    "banana":"very yellow",
    "apple":"very green" 
  }
}
```
Nilai templ `ctx.identity.resolverContext.apple` at resolver adalah "`very green`”. Ob `resolverContext` jek hanya mendukung pasangan kunci-nilai. Kunci bersarang tidak didukung.  
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 (`{{typename}}.{{fieldname}}`) dapat secara tidak sengaja menyembunyikan bidang. Untuk memisahkan bidang di`deniedFields`, 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 Kon AWS AppSync sol dan arahkan ke API yang ingin Anda perbarui.

1. Arahkan ke halaman Pengaturan untuk API Anda.

   Ubah API-Level otorisasi menjadi **AWS Lambda**.

1. Pilih Wilayah AWS dan Lambda ARN untuk mengotorisasi panggilan API.
**catatan**  
Kebijakan utama yang sesuai akan ditambahkan secara otomatis, memungkinkan AWS AppSync untuk memanggil fungsi Lambda Anda. 

1. 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 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
   ```

1. Perbarui AWS AppSync API Anda untuk menggunakan fungsi Lambda ARN 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 lainnya seperti ekspresi reguler token. 

------

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
<a name="aws-lambda-authorization-create-new-auth-token"></a>

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
<a name="aws-iam-authorization"></a>

Jenis otorisasi ini memberlakukan proses penandatanganan [AWS tanda tangan versi 4 ](https://docs.aws.amazon.com/general/latest/gr/signature-version-4.html) pada GraphQL API. Anda dapat mengaitkan kebijakan akses Manajemen Identitas dan Akses ([IAM](https://aws.amazon.com/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 kredentif sementara berumur pendek yang disediakan oleh Amazon Cognito Federated Identities.

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

------
#### [ JSON ]

****  

```
{
   "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 hanya ke operasi GraphQL tertentu, Anda dapat melakukan ini untuk root`Query`,`Mutation`, dan `Subscription` bidang.

------
#### [ JSON ]

****  

```
{
   "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 yang sesuai untuk peran (yang dapat Anda lampirkan ke kumpulan identitas Amazon Cognito, misalnya) akan terlihat seperti berikut:

------
#### [ JSON ]

****  

```
{
    "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
<a name="openid-connect-authorization"></a>

Jenis otorisasi ini memberlakukan token [ OpenID connect ](https://openid.net/specs/openid-connect-core-1_0.html) (OIDC) yang disediakan oleh layanan. OIDC-compliant Aplikasi Anda dapat memanfaatkan pengguna dan hak istimewa yang ditentukan oleh penyedia OIDC Anda untuk mengontrol akses.

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. ](https://openid.net/specs/openid-connect-discovery-1_0.html) Ia mengharapkan untuk mengambil dokumen JSON yang sesuai [ dengan RFC57 ](https://tools.ietf.org/html/rfc5785) 85 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 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
<a name="amazon-cognito-user-pools-authorization"></a>

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
<a name="using-additional-authorization-modes"></a>

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 di `API_KEY` otorisasi.
+  `@aws_iam`- Untuk menentukan bahwa bidang tersebut di `AWS_IAM` otorisasi.
+  `@aws_oidc`- Untuk menentukan bahwa bidang tersebut di `OPENID_CONNECT` otorisasi.
+  `@aws_cognito_user_pools`- Untuk menentukan bahwa bidang tersebut di `AMAZON_COGNITO_USER_POOLS` otorisasi.
+  `@aws_lambda`- Untuk menentukan bahwa bidang tersebut di `AWS_LAMBDA` otorisasi.

Anda tidak dapat menggunakan direk `@aws_auth` tif bersama dengan mode otorisasi tambahan. `@aws_auth`bekerja 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 menggunakan`AWS_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_IAM`permintaan yang diautentikasi dapat mengakses`restrictedContent`, 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
<a name="fine-grained-access-control"></a>

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](#aws-appsync-filtering-information).

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 ](resolver-mapping-template-reference.md#aws-appsync-resolver-mapping-template-reference) dan referensi template pemetaan [ Resolver untuk DynamoDB. ](resolver-mapping-template-reference-dynamodb.md#aws-appsync-resolver-mapping-template-reference-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.

![Four-step alur kerja yang menunjukkan pengambilan token, pengiriman permintaan, pemeriksaan bersyarat, dan eksekusi operasi.](https://docs.aws.amazon.com/id_id/appsync/latest/devguide/images/FGAC.png)


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 untuk`editPost`, 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 sebuah`UpdateItem`, tetapi konsep yang sama berlaku pada blok `condition` pernyataan.

## Memfilter informasi
<a name="aws-appsync-filtering-information"></a>

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 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;
}
```

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
<a name="data-source-access"></a>

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

------
#### [ JSON ]

****  

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

------

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.