

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

# Autentikasi dan otorisasi kustom
<a name="custom-authentication"></a>

 AWS IoT Core memungkinkan Anda menentukan otorisasi khusus sehingga Anda dapat mengelola otentikasi dan otorisasi klien Anda sendiri. Ini berguna ketika Anda perlu menggunakan mekanisme otentikasi selain yang mendukung AWS IoT Core secara asli. (Untuk informasi lebih lanjut tentang mekanisme yang didukung secara asli, lihat[Autentikasi Klien](client-authentication.md)).  

 Misalnya, jika Anda memigrasikan perangkat yang ada di bidang ke AWS IoT Core dan perangkat ini menggunakan token pembawa kustom atau nama pengguna dan kata sandi MQTT untuk mengautentikasi, Anda dapat memigrasikannya AWS IoT Core tanpa harus memberikan identitas baru untuknya. Anda dapat menggunakan otentikasi khusus dengan salah satu protokol komunikasi yang mendukung. AWS IoT Core Untuk informasi selengkapnya tentang protokol yang AWS IoT Core mendukung, lihat. [Protokol komunikasi perangkat](protocols.md) 

**Topics**
+ [Memahami alur kerja otentikasi kustom](custom-authorizer.md)
+ [Membuat dan mengelola otorisasi kustom (CLI)](config-custom-auth.md)
+ [Otentikasi khusus dengan sertifikat klien X.509](custom-auth-509cert.md)
+ [Menghubungkan ke AWS IoT Core dengan menggunakan otentikasi kustom](custom-auth.md)
+ [Memecahkan masalah otorisasi Anda](custom-auth-troubleshooting.md)

# Memahami alur kerja otentikasi kustom
<a name="custom-authorizer"></a>

[Otentikasi khusus memungkinkan Anda menentukan cara mengautentikasi dan mengotorisasi klien dengan menggunakan sumber daya otorisasi.](https://docs.aws.amazon.com/iot/latest/apireference/API_AuthorizerDescription.html)  Setiap authorizer berisi referensi ke fungsi Lambda yang dikelola pelanggan, kunci publik opsional untuk memvalidasi kredensi perangkat, dan informasi konfigurasi tambahan. Diagram berikut menggambarkan alur kerja otorisasi untuk otentikasi kustom di. AWS IoT Core

![\[Alur kerja otorisasi khusus untuk otentikasi khusus di. AWS IoT Core\]](http://docs.aws.amazon.com/id_id/iot/latest/developerguide/images/custom-authentication.png)


## AWS IoT Core otentikasi kustom dan alur kerja otorisasi
<a name="custom-authentication-workflow"></a>

Daftar berikut menjelaskan setiap langkah dalam alur kerja autentikasi dan otorisasi kustom.

1. Perangkat terhubung ke titik akhir AWS IoT Core data pelanggan dengan menggunakan salah satu yang didukung[Protokol komunikasi perangkat](protocols.md). Perangkat meneruskan kredensyal baik di bidang header permintaan atau parameter kueri (untuk HTTP Publish atau MQTT melalui WebSockets protokol), atau di bidang nama pengguna dan kata sandi pesan MQTT CONNECT (untuk MQTT dan MQTT melalui protokol). WebSockets 

1. AWS IoT Core memeriksa salah satu dari dua kondisi:
   + Permintaan yang masuk menentukan otorisasi.
   + Titik akhir AWS IoT Core data yang menerima permintaan memiliki otorisasi default yang dikonfigurasi untuknya.

   Jika AWS IoT Core menemukan otorisasi dengan salah satu cara ini, AWS IoT Core memicu fungsi Lambda yang terkait dengan otorisasi.

1.  (Opsional) Jika Anda telah mengaktifkan penandatanganan token, AWS IoT Core validasi tanda tangan permintaan dengan menggunakan kunci publik yang disimpan di otorisasi sebelum memicu fungsi Lambda. Jika validasi gagal, AWS IoT Core hentikan permintaan tanpa menjalankan fungsi Lambda.  

1. Fungsi Lambda menerima kredensyal dan metadata koneksi dalam permintaan dan membuat keputusan otentikasi.

1. Fungsi Lambda mengembalikan hasil keputusan otentikasi dan dokumen AWS IoT Core kebijakan yang menentukan tindakan apa yang diizinkan dalam koneksi. Fungsi Lambda juga mengembalikan informasi yang menentukan seberapa sering AWS IoT Core memvalidasi ulang kredensyal dalam permintaan dengan menjalankan fungsi Lambda.

1. AWS IoT Core mengevaluasi aktivitas pada koneksi terhadap kebijakan yang diterimanya dari fungsi Lambda.

1. Setelah koneksi dibuat dan Lambda otorisasi kustom Anda awalnya dipanggil, pemanggilan berikutnya dapat ditunda hingga 5 menit pada koneksi idle tanpa operasi MQTT apa pun. Setelah itu, pemanggilan berikutnya akan mengikuti interval penyegaran di Lambda otorisasi khusus Anda. Pendekatan ini dapat mencegah pemanggilan berlebihan yang dapat melebihi batas konkurensi Lambda Anda. Akun AWS

## Pertimbangan penskalaan
<a name="custom-authentication-scaling"></a>

 Karena fungsi Lambda menangani otentikasi dan otorisasi untuk otorisasi Anda, fungsi tersebut tunduk pada harga Lambda dan batas layanan, seperti tingkat eksekusi bersamaan. [Untuk informasi selengkapnya tentang harga Lambda, lihat Harga Lambda.](https://aws.amazon.com/lambda/pricing/) Anda dapat mengelola beban pada fungsi Lambda Anda dengan menyesuaikan `refreshAfterInSeconds` dan `disconnectAfterInSeconds` parameter dalam respons fungsi Lambda Anda. Untuk informasi selengkapnya tentang isi respons fungsi Lambda Anda, lihat. [Mendefinisikan fungsi Lambda Anda](custom-auth-lambda.md)

**catatan**  
Jika Anda membiarkan penandatanganan diaktifkan, Anda dapat mencegah pemicu Lambda yang berlebihan oleh klien yang tidak dikenal. Pertimbangkan ini sebelum Anda menonaktifkan penandatanganan di otorisasi Anda.

**catatan**  
Batas waktu tunggu fungsi Lambda untuk otorisasi khusus adalah 5 detik.

# Membuat dan mengelola otorisasi kustom (CLI)
<a name="config-custom-auth"></a>

AWS IoT Core mengimplementasikan otentikasi kustom dan skema otorisasi dengan menggunakan otorisasi kustom. Authorizer kustom adalah AWS IoT Core sumber daya yang memberi Anda fleksibilitas untuk menentukan dan menerapkan aturan dan kebijakan berdasarkan persyaratan spesifik Anda. Untuk membuat otorisasi khusus dengan step-by-step instruksi, lihat [Tutorial: Membuat otorisasi khusus](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html) untuk. AWS IoT Core

Setiap authorizer terdiri dari komponen-komponen berikut: 
+  *Nama*: String unik yang ditentukan pengguna yang mengidentifikasi otorisasi.
+  Fungsi *Lambda ARN:* Nama Sumber Daya Amazon (ARN) dari fungsi Lambda yang mengimplementasikan logika otorisasi dan otentikasi.  
+  *Nama kunci token: Nama* kunci yang digunakan untuk mengekstrak token dari header HTTP, parameter kueri, atau nama pengguna MQTT CONNECT untuk melakukan validasi tanda tangan. Nilai ini diperlukan jika penandatanganan diaktifkan di otorisasi Anda. 
+  *Penandatanganan flag dinonaktifkan (opsional)*: Nilai Boolean yang menentukan apakah akan menonaktifkan persyaratan penandatanganan pada kredensyal. Ini berguna untuk skenario di mana penandatanganan kredensyal tidak masuk akal, seperti skema otentikasi yang menggunakan nama pengguna dan kata sandi MQTT. Nilai defaultnya adalah`false`, jadi penandatanganan diaktifkan secara default. 
+  *Kunci publik penandatanganan token*: Kunci publik yang AWS IoT Core digunakan untuk memvalidasi tanda tangan token. Panjang minimumnya adalah 2.048 bit. Nilai ini diperlukan jika penandatanganan diaktifkan di otorisasi Anda.  

Lambda menagih Anda untuk berapa kali fungsi Lambda Anda berjalan dan untuk jumlah waktu yang diperlukan untuk kode dalam fungsi Anda untuk mengeksekusi. [Untuk informasi selengkapnya tentang harga Lambda, lihat Harga Lambda.](https://aws.amazon.com/lambda/pricing/) Untuk informasi selengkapnya tentang membuat fungsi Lambda, lihat Panduan Pengembang [Lambda](https://docs.aws.amazon.com/lambda/latest/dg/).

**catatan**  
Jika Anda membiarkan penandatanganan diaktifkan, Anda dapat mencegah pemicu Lambda yang berlebihan oleh klien yang tidak dikenal. Pertimbangkan ini sebelum Anda menonaktifkan penandatanganan di otorisasi Anda.

**catatan**  
Batas waktu tunggu fungsi Lambda untuk otorisasi khusus adalah 5 detik.

**Topics**
+ [Mendefinisikan fungsi Lambda Anda](custom-auth-lambda.md)
+ [Membuat Authorizer](custom-auth-create-authorizer.md)
+ [Otorisasi AWS IoT untuk menjalankan fungsi Lambda Anda](custom-auth-authorize.md)
+ [Menguji otorisasi Anda](custom-auth-testing.md)
+ [Mengelola otorisasi khusus](custom-auth-manage.md)

# Mendefinisikan fungsi Lambda Anda
<a name="custom-auth-lambda"></a>

 Saat AWS IoT Core memanggil otorisasi Anda, itu memicu Lambda terkait yang terkait dengan otorisasi dengan peristiwa yang berisi objek JSON berikut. Contoh objek JSON berisi semua bidang yang mungkin. Bidang apa pun yang tidak relevan dengan permintaan koneksi tidak disertakan.

```
{
    "token" :"aToken",
    "signatureVerified": Boolean, // Indicates whether the device gateway has validated the signature.
    "protocols": ["tls", "http", "mqtt"], // Indicates which protocols to expect for the request.
    "protocolData": {
        "tls" : {
            "serverName": "serverName" // The server name indication (SNI) host_name string.
        },
        "http": {
            "headers": {
                "#{name}": "#{value}"
            },
            "queryString": "?#{name}=#{value}"
        },
        "mqtt": {
            "username": "myUserName",
            "password": "myPassword", // A base64-encoded string.
            "clientId": "myClientId" // Included in the event only when the device sends the value.
        }
    },
    "connectionMetadata": {
        "id": UUID // The connection ID. You can use this for logging.
    },
}
```

 Fungsi Lambda harus menggunakan informasi ini untuk mengautentikasi koneksi yang masuk dan memutuskan tindakan apa yang diizinkan dalam koneksi. Fungsi harus mengirim respons yang berisi nilai-nilai berikut. 
+  `isAuthenticated`: Nilai Boolean yang menunjukkan apakah permintaan diautentikasi.
+  `principalId`: String alfanumerik yang bertindak sebagai pengidentifikasi untuk token yang dikirim oleh permintaan otorisasi kustom. Nilai harus berupa string alfanumerik dengan setidaknya satu, dan tidak lebih dari 128, karakter dan cocok dengan pola ekspresi reguler (regex) ini:. `([a-zA-Z0-9]){1,128}` Karakter khusus yang tidak alfanumerik tidak diizinkan untuk digunakan dengan in. `principalId` AWS IoT Core Lihat dokumentasi untuk AWS layanan lain jika karakter khusus non-alfanumerik diizinkan untuk. `principalId`
+  `policyDocuments`: Daftar dokumen AWS IoT Core kebijakan berformat JSON Untuk informasi selengkapnya tentang membuat AWS IoT Core kebijakan, lihat. [AWS IoT Core kebijakan](iot-policies.md) Jumlah maksimum dokumen kebijakan adalah 10 dokumen kebijakan. Setiap dokumen kebijakan dapat berisi maksimal 2.048 karakter.
+  `disconnectAfterInSeconds`: Sebuah integer yang menentukan durasi maksimum (dalam detik) dari koneksi ke gateway. AWS IoT Core Nilai minimum adalah 300 detik, dan nilai maksimumnya adalah 86.400 detik. Nilai defaultnya adalah 86.400.
**catatan**  
Nilai `disconnectAfterInSeconds` (dikembalikan oleh fungsi Lambda) diatur saat koneksi dibuat. Nilai ini tidak dapat diubah selama pemanggilan Lambda refresh kebijakan berikutnya.
+  `refreshAfterInSeconds`: Sebuah integer yang menentukan interval antara kebijakan refresh. Ketika interval ini berlalu, AWS IoT Core memanggil fungsi Lambda untuk mengizinkan refresh kebijakan. Nilai minimum adalah 300 detik, dan nilai maksimumnya adalah 86.400 detik. 

  Objek JSON berikut berisi contoh respons yang dapat dikirim oleh fungsi Lambda Anda. 

 **\$1 "isAuthenticated":true, //A Boolean that determines whether client can connect. "principalId": "xxxxxxxx",  //A string that identifies the connection in logs. "disconnectAfterInSeconds": 86400,  "refreshAfterInSeconds": 300,   "policyDocuments": [       \$1         "Version": "2012-10-17",         "Statement": [            \$1               "Action": "iot:Publish",               "Effect": "Allow",               "Resource": "arn:aws:iot:us-east-1:<your\$1aws\$1account\$1id>:topic/customauthtesting"             \$1          ]        \$1     ] \$1**

 `policyDocument`Nilai harus berisi dokumen AWS IoT Core kebijakan yang valid. Untuk informasi selengkapnya tentang AWS IoT Core kebijakan, lihat[AWS IoT Core kebijakan](iot-policies.md). Di MQTT melalui TLS dan MQTT melalui WebSockets koneksi, AWS IoT Core cache kebijakan ini untuk interval yang ditentukan dalam nilai bidang. `refreshAfterInSeconds` Dalam kasus koneksi HTTP, fungsi Lambda dipanggil untuk setiap permintaan otorisasi kecuali perangkat Anda menggunakan koneksi persisten HTTP (juga disebut HTTP keep-alive atau penggunaan kembali koneksi HTTP) Anda dapat memilih untuk mengaktifkan caching saat mengonfigurasi otorisasi. Selama interval ini, AWS IoT Core mengotorisasi tindakan dalam koneksi yang dibuat terhadap kebijakan cache ini tanpa memicu fungsi Lambda Anda lagi. Jika kegagalan terjadi selama otentikasi kustom, AWS IoT Core menghentikan koneksi. AWS IoT Core juga mengakhiri koneksi jika telah terbuka lebih lama dari nilai yang ditentukan dalam `disconnectAfterInSeconds` parameter. 

 Berikut ini JavaScript berisi contoh fungsi Lambda Node.js yang mencari kata sandi dalam pesan MQTT Connect dengan nilai `test` dan mengembalikan kebijakan yang memberikan izin untuk terhubung dengan klien `myClientName` bernama dan memublikasikan AWS IoT Core ke topik yang berisi nama klien yang sama. Jika tidak menemukan kata sandi yang diharapkan, ia mengembalikan kebijakan yang menyangkal kedua tindakan tersebut. 

```
// A simple Lambda function for an authorizer. It demonstrates 
// how to parse an MQTT password and generate a response.

exports.handler = function(event, context, callback) { 
    var uname = event.protocolData.mqtt.username;
    var pwd = event.protocolData.mqtt.password;
    var buff = new Buffer(pwd, 'base64');
    var passwd = buff.toString('ascii');
    switch (passwd) { 
        case 'test': 
            callback(null, generateAuthResponse(passwd, 'Allow')); 
            break;
        default: 
            callback(null, generateAuthResponse(passwd, 'Deny'));  
    }
};

// Helper function to generate the authorization response.
var generateAuthResponse = function(token, effect) { 
    var authResponse = {}; 
    authResponse.isAuthenticated = true; 
    authResponse.principalId = 'TEST123'; 
    
    var policyDocument = {}; 
    policyDocument.Version = '2012-10-17';		 	 	 
    policyDocument.Statement = []; 
    var publishStatement = {}; 
    var connectStatement = {};
    connectStatement.Action = ["iot:Connect"];
    connectStatement.Effect = effect;
    connectStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:client/myClientName"];
    publishStatement.Action = ["iot:Publish"]; 
    publishStatement.Effect = effect; 
    publishStatement.Resource = ["arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"]; 
    policyDocument.Statement[0] = connectStatement;
    policyDocument.Statement[1] = publishStatement; 
    authResponse.policyDocuments = [policyDocument]; 
    authResponse.disconnectAfterInSeconds = 3600; 
    authResponse.refreshAfterInSeconds = 300;
    
    return authResponse; 
}
```

 Fungsi Lambda sebelumnya mengembalikan JSON berikut ketika menerima kata sandi yang diharapkan dari dalam `test` pesan MQTT Connect. Nilai `password` dan `principalId` properti akan menjadi nilai dari pesan MQTT Connect.

```
{
  "password": "password",
  "isAuthenticated": true,
  "principalId": "principalId",
  "policyDocuments": [
    {
      "Version": "2012-10-17",		 	 	 
      "Statement": [
        {
          "Action": "iot:Connect",
          "Effect": "Allow",
          "Resource": "*"
        },
        {
          "Action": "iot:Publish",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Subscribe",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topicfilter/telemetry/${iot:ClientId}"
        },
        {
          "Action": "iot:Receive",
          "Effect": "Allow",
          "Resource": "arn:aws:iot:region:accountId:topic/telemetry/${iot:ClientId}"
        }
      ]
    }
  ],
  "disconnectAfterInSeconds": 3600,
  "refreshAfterInSeconds": 300
}
```

# Membuat Authorizer
<a name="custom-auth-create-authorizer"></a>

 Anda dapat membuat authorizer dengan menggunakan [CreateAuthorizerAPI](https://docs.aws.amazon.com/iot/latest/apireference/API_CreateAuthorizer.html). Contoh berikut menjelaskan perintah. 

```
aws iot create-authorizer
--authorizer-name MyAuthorizer
--authorizer-function-arn arn:aws:lambda:us-west-2:<account_id>:function:MyAuthorizerFunction  //The ARN of the Lambda function.
[--token-key-name MyAuthorizerToken //The key used to extract the token from headers.
[--token-signing-public-keys FirstKey=
 "-----BEGIN PUBLIC KEY-----
  [...insert your public key here...] 
  -----END PUBLIC KEY-----"
[--status ACTIVE]
[--tags <value>]
[--signing-disabled | --no-signing-disabled]
```

Anda dapat menggunakan `signing-disabled` parameter untuk memilih keluar dari validasi tanda tangan untuk setiap pemanggilan otorisasi Anda. Kami sangat menyarankan agar Anda tidak menonaktifkan penandatanganan kecuali Anda harus melakukannya. Validasi tanda tangan melindungi Anda dari pemanggilan berlebihan fungsi Lambda Anda dari perangkat yang tidak dikenal. Anda tidak dapat memperbarui `signing-disabled` status otorisasi setelah Anda membuatnya. Untuk mengubah perilaku ini, Anda harus membuat otorisasi khusus lain dengan nilai `signing-disabled` parameter yang berbeda. 

Nilai untuk `tokenSigningPublicKeys` parameter `tokenKeyName` dan bersifat opsional jika Anda menonaktifkan penandatanganan. Mereka adalah nilai yang diperlukan jika penandatanganan diaktifkan. 

Setelah Anda membuat fungsi Lambda dan otorisasi kustom, Anda harus secara eksplisit memberikan izin AWS IoT Core layanan untuk memanggil fungsi atas nama Anda. Anda dapat melakukan ini dengan perintah berikut. 

**catatan**  
Titik akhir IoT default mungkin tidak mendukung penggunaan otorisasi khusus dengan fungsi Lambda. Sebagai gantinya, Anda dapat menggunakan konfigurasi domain untuk menentukan titik akhir baru dan kemudian menentukan titik akhir tersebut untuk otorisasi kustom.

```
aws lambda add-permission --function-name <lambda_function_name>
--principal iot.amazonaws.com --source-arn <authorizer_arn>
--statement-id Id-123 --action "lambda:InvokeFunction"
```

# Otorisasi AWS IoT untuk menjalankan fungsi Lambda Anda
<a name="custom-auth-authorize"></a>

Di bagian ini, Anda akan memberikan izin dari sumber otorisasi kustom yang baru saja Anda buat untuk menjalankan fungsi Lambda. Untuk memberikan izin, Anda dapat menggunakan perintah CLI [izin tambahan](https://docs.aws.amazon.com//cli/latest/reference/lambda/add-permission.html).

**Berikan izin ke fungsi Lambda Anda menggunakan AWS CLI**

1. Setelah memasukkan nilai Anda, masukkan perintah berikut. Perhatikan bahwa `statement-id` nilainya harus unik. Ganti `Id-1234` dengan nilai persis yang Anda miliki, jika tidak, Anda mungkin mendapatkan `ResourceConflictException` kesalahan.

   ```
   aws lambda add-permission  \
   --function-name "custom-auth-function" \
   --principal "iot.amazonaws.com" \
   --action "lambda:InvokeFunction" \
   --statement-id "Id-1234" \
   --source-arn authorizerArn
   ```

1. Jika perintah berhasil, ia mengembalikan pernyataan izin, seperti contoh ini. Anda dapat melanjutkan ke bagian berikutnya untuk menguji otorisasi khusus.

   ```
   {
       "Statement": "{\"Sid\":\"Id-1234\",\"Effect\":\"Allow\",\"Principal\":{\"Service\":\"iot.amazonaws.com\"},\"Action\":\"lambda:InvokeFunction\",\"Resource\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\",\"Condition\":{\"ArnLike\":{\"AWS:SourceArn\":\"arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function\"}}}"
   }
   ```

   Jika perintah tidak berhasil, ia mengembalikan kesalahan, seperti contoh ini. Anda harus meninjau dan memperbaiki kesalahan sebelum melanjutkan.

   ```
   An error occurred (AccessDeniedException) when calling the AddPermission operation: User: arn:aws:iam::57EXAMPLE833:user/EXAMPLE-1 is not authorized to perform: lambda:AddPer
   mission on resource: arn:aws:lambda:Region:57EXAMPLE833:function:custom-auth-function
   ```

# Menguji otorisasi Anda
<a name="custom-auth-testing"></a>

 Anda dapat menggunakan [TestInvokeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_TestInvokeAuthorizer.html)API untuk menguji pemanggilan dan mengembalikan nilai otorisasi Anda. API ini memungkinkan Anda menentukan metadata protokol dan menguji validasi tanda tangan di otorisasi Anda.

Tab berikut menunjukkan cara menggunakan AWS CLI untuk menguji otorisasi Anda.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER \
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER ^
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER `
--token TOKEN_VALUE --token-signature TOKEN_SIGNATURE
```

------

Nilai `token-signature` parameter adalah token yang ditandatangani. Untuk mempelajari cara mendapatkan nilai ini, lihat[Menandatangani token](custom-auth.md#custom-auth-token-signature).

Jika otorisasi Anda mengambil nama pengguna dan kata sandi, Anda dapat meneruskan informasi ini dengan menggunakan `--mqtt-context` parameter. Tab berikut menunjukkan cara menggunakan `TestInvokeAuthorizer` API untuk mengirim objek JSON yang berisi nama pengguna, kata sandi, dan nama klien ke otorisasi kustom Anda.

------
#### [ Unix-like ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  \
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows CMD ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  ^
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------
#### [ Windows PowerShell ]

```
aws iot test-invoke-authorizer --authorizer-name NAME_OF_AUTHORIZER  `
--mqtt-context '{"username": "USER_NAME", "password": "dGVzdA==", "clientId":"CLIENT_NAME"}'
```

------

Kata sandi harus dikodekan base64. Contoh berikut menunjukkan cara menyandikan kata sandi di lingkungan mirip Unix.

```
echo -n PASSWORD | base64
```

# Mengelola otorisasi khusus
<a name="custom-auth-manage"></a>

 Anda dapat mengelola otorisasi Anda dengan menggunakan yang berikut APIs ini. 
+ [ListAuthorizers](https://docs.aws.amazon.com/iot/latest/apireference/API_ListAuthorizers.html): Tampilkan semua otorisasi di akun Anda.
+  [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html): Menampilkan properti dari authorizer yang ditentukan. Nilai-nilai ini termasuk tanggal pembuatan, tanggal modifikasi terakhir, dan atribut lainnya.
+ [SetDefaultAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_SetDefaultAuthorizer.html): Menentukan authorizer default untuk endpoint AWS IoT Core data Anda. AWS IoT Core menggunakan otorisasi ini jika perangkat tidak meneruskan AWS IoT Core kredensyal dan tidak menentukan otorisasi. Untuk informasi selengkapnya tentang penggunaan AWS IoT Core kredensyal, lihat. [Autentikasi Klien](client-authentication.md)
+ [UpdateAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_UpdateAuthorizer.html): Mengubah status, nama kunci token, atau kunci publik untuk otorisasi yang ditentukan.
+  [DeleteAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DeleteAuthorizer.html): Menghapus otorisasi yang ditentukan. 

**catatan**  
 Anda tidak dapat memperbarui persyaratan penandatanganan otorisasi. Ini berarti Anda tidak dapat menonaktifkan penandatanganan di otorisasi yang sudah ada yang memerlukannya. Anda juga tidak dapat meminta masuk ke otorisasi yang sudah ada yang tidak memerlukannya. 

# Otentikasi khusus dengan sertifikat klien X.509
<a name="custom-auth-509cert"></a>

Saat menghubungkan perangkat AWS IoT Core, Anda memiliki beberapa [jenis otentikasi](protocols.md#connection-protocol-auth-mode) yang tersedia. Anda dapat menggunakan [sertifikat klien X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) yang dapat digunakan untuk mengautentikasi koneksi klien dan perangkat, atau menentukan [otorisasi khusus untuk mengelola otentikasi klien dan logika otorisasi](https://docs.aws.amazon.com//iot/latest/developerguide/custom-authentication.html) Anda sendiri. Topik ini mencakup cara menggunakan otentikasi khusus dengan sertifikat klien X.509.

Menggunakan otentikasi kustom dengan sertifikat X.509 dapat membantu jika Anda telah mengautentikasi perangkat Anda menggunakan sertifikat X.509 dan ingin melakukan validasi tambahan dan otorisasi khusus. Misalnya, jika Anda menyimpan data perangkat Anda seperti nomor seri mereka dalam sertifikat klien X.509, setelah AWS IoT Core mengautentikasi sertifikat klien X.509, Anda dapat menggunakan otorisasi khusus untuk mengidentifikasi perangkat tertentu berdasarkan informasi yang disimpan di bidang sertifikat. CommonName Menggunakan otentikasi khusus dengan sertifikat X.509 dapat meningkatkan manajemen keamanan perangkat Anda saat menghubungkan perangkat ke AWS IoT Core dan memberikan lebih banyak fleksibilitas untuk mengelola logika otentikasi dan otorisasi. AWS IoT Core [https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html](https://docs.aws.amazon.com//iot/latest/developerguide/mqtt.html) [Untuk informasi selengkapnya tentang jenis autentikasi dan protokol aplikasi yang didukung titik akhir AWS IoT Core perangkat, lihat Protokol komunikasi perangkat.](https://docs.aws.amazon.com//iot/latest/developerguide/protocols.html)

**catatan**  
Otentikasi kustom dengan sertifikat klien X.509 tidak didukung di Wilayah. AWS GovCloud (US) 

**penting**  
Anda harus menggunakan endpoint yang dibuat menggunakan [konfigurasi domain](iot-custom-endpoints-configurable.md). Selain itu, klien harus memberikan ekstensi [Server Name Indication (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) saat menghubungkan ke AWS IoT Core.

**Topics**
+ [Langkah 1: Daftarkan sertifikat klien X.509 Anda dengan AWS IoT Core](#custom-auth-509cert-client)
+ [Langkah 2: Buat fungsi Lambda](#custom-auth-509cert-lambda)
+ [Langkah 3: Buat otorisasi khusus](#custom-auth-509cert-authorizer)
+ [Langkah 4: Tetapkan jenis otentikasi dan protokol aplikasi dalam konfigurasi domain](#custom-auth-509cert-domainconfig)

## Langkah 1: Daftarkan sertifikat klien X.509 Anda dengan AWS IoT Core
<a name="custom-auth-509cert-client"></a>

Jika Anda belum melakukan ini, daftar dan aktifkan sertifikat [klien X.509](https://docs.aws.amazon.com//iot/latest/developerguide/x509-client-certs.html) Anda dengan. AWS IoT Core Jika tidak, lewati ke langkah berikutnya.

Untuk mendaftar dan mengaktifkan sertifikat klien Anda AWS IoT Core, ikuti langkah-langkahnya:

1. Jika Anda [membuat sertifikat klien secara langsung dengan AWS IoT](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-create.html). Sertifikat klien ini akan didaftarkan secara otomatis AWS IoT Core.

1. Jika Anda [membuat sertifikat klien Anda sendiri](https://docs.aws.amazon.com//iot/latest/developerguide/device-certs-your-own.html), ikuti [petunjuk ini untuk mendaftarkannya AWS IoT Core](https://docs.aws.amazon.com//iot/latest/developerguide/register-device-cert.html).

1. Untuk mengaktifkan sertifikat klien Anda, ikuti [petunjuk ini](https://docs.aws.amazon.com//iot/latest/developerguide/activate-or-deactivate-device-cert.html).

## Langkah 2: Buat fungsi Lambda
<a name="custom-auth-509cert-lambda"></a>

AWS IoT Core menggunakan otorisasi khusus untuk menerapkan otentikasi kustom dan skema otorisasi. Authorizer khusus dikaitkan dengan fungsi Lambda yang menentukan apakah perangkat diautentikasi dan operasi apa yang diizinkan untuk dilakukan perangkat. Saat perangkat terhubung AWS IoT Core, AWS IoT Core mengambil detail otorisasi termasuk nama otorisasi dan fungsi Lambda terkait, dan memanggil fungsi Lambda. Fungsi Lambda menerima peristiwa yang berisi objek JSON dengan data sertifikat klien X.509 perangkat. Fungsi Lambda Anda menggunakan objek JSON peristiwa ini untuk mengevaluasi permintaan otentikasi, memutuskan tindakan yang akan diambil, dan mengirim respons kembali.

### Contoh acara fungsi Lambda
<a name="custom-auth-509cert-event"></a>

Contoh objek JSON berikut berisi semua bidang yang mungkin yang dapat disertakan. Objek JSON yang sebenarnya hanya akan berisi bidang yang relevan dengan permintaan koneksi tertentu.

```
{
	"token": "aToken",
	"signatureVerified": true,
	"protocols": [
		"tls",
		"mqtt"
	],
	"protocolData": {
		"tls": {
			"serverName": "serverName",
			"x509CertificatePem": "x509CertificatePem",
			"principalId": "principalId"
		},
		"mqtt": {
			"clientId": "myClientId",
                     "username": "myUserName",
                     "password": "myPassword"
		}
	},
	"connectionMetadata": {
		"id": "UUID"
	}
}
```

`signatureVerified`  
Nilai Boolean yang menunjukkan apakah tanda tangan token yang dikonfigurasi di otorisasi diverifikasi atau tidak sebelum menjalankan fungsi Lambda otorisasi. Jika otorisasi dikonfigurasi untuk menonaktifkan penandatanganan token, bidang ini akan salah. 

`protocols`  
Array yang berisi protokol yang diharapkan untuk permintaan.

`protocolData`  
Objek yang berisi informasi protokol yang digunakan dalam koneksi. Ini memberikan rincian spesifik protokol yang dapat berguna untuk otentikasi, otorisasi, dan banyak lagi.  
`tls`- Objek ini menyimpan informasi yang terkait dengan protokol TLS (Transport Layer Security).   
+ `serverName`- String [nama host Indikasi Nama Server (SNI)](https://www.rfc-editor.org/rfc/rfc3546#section-3.1). AWS IoT Core membutuhkan perangkat untuk mengirim [ekstensi SNI](https://www.rfc-editor.org/rfc/rfc3546#section-3.1) ke protokol Transport Layer Security (TLS) dan memberikan alamat endpoint lengkap di lapangan. `host_name`
+ `x509CertificatePem`- Sertifikat X.509 dalam format PEM, yang digunakan untuk otentikasi klien dalam koneksi TLS.
+ `principalId`- Pengidentifikasi utama yang terkait dengan klien dalam koneksi TLS.
`mqtt`- Objek ini menyimpan informasi yang terkait dengan protokol MQTT.  
+ `clientId`- String hanya perlu disertakan jika perangkat mengirimkan nilai ini.
+ `username`- Nama pengguna yang disediakan dalam paket MQTT Connect.
+ `password`- Kata sandi yang disediakan dalam paket MQTT Connect.

`connectionMetadata`  
Metadata koneksi.  
`id`- ID koneksi, yang dapat Anda gunakan untuk logging dan pemecahan masalah.

**catatan**  
Dalam acara ini objek JSON, `x509CertificatePem` dan `principalId` dua bidang baru dalam permintaan. Nilai `principalId` adalah sama dengan nilai`certificateId`. Untuk informasi selengkapnya, lihat [Sertifikat](https://docs.aws.amazon.com//iot/latest/apireference/API_Certificate.html).

### Contoh respons fungsi Lambda
<a name="custom-auth-509cert-response"></a>

Fungsi Lambda harus menggunakan informasi dari objek JSON peristiwa untuk mengautentikasi koneksi yang masuk dan memutuskan tindakan apa yang diizinkan dalam koneksi.

Objek JSON berikut berisi contoh respons yang dapat dikirim oleh fungsi Lambda Anda.

```
{
	"isAuthenticated": true,
	"principalId": "xxxxxxxx",
	"disconnectAfterInSeconds": 86400,
	"refreshAfterInSeconds": 300,
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Effect": "Allow",
					"Action": "iot:Publish",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/customauthtesting"
				}
			]
		}
	]
}
```

Dalam contoh ini, fungsi ini harus mengirim respons yang berisi nilai-nilai berikut.

`isAuthenticated`  
Nilai Boolean yang menunjukkan apakah permintaan diautentikasi.

`principalId`  
String alfanumerik yang bertindak sebagai pengidentifikasi untuk token yang dikirim oleh permintaan otorisasi kustom. Nilai harus berupa string alfanumerik dengan setidaknya satu, dan tidak lebih dari 128 karakter. Ini mengidentifikasi koneksi di log. Nilai `principalId` harus sama dengan nilai `principalId` dalam objek JSON peristiwa (yaitu CertificateId dari sertifikat X.509).

`policyDocuments`  
Daftar dokumen kebijakan berformat JSON AWS IoT Core . Nilainya opsional dan mendukung [variabel kebijakan hal](https://docs.aws.amazon.com//iot/latest/developerguide/thing-policy-variables.html) dan [variabel kebijakan sertifikat](https://docs.aws.amazon.com//iot/latest/developerguide/cert-policy-variables.html). Jumlah maksimum dokumen kebijakan adalah 10. Setiap dokumen kebijakan dapat berisi maksimal 2.048 karakter. Jika Anda memiliki beberapa kebijakan yang dilampirkan pada sertifikat klien dan fungsi Lambda, izin tersebut merupakan kumpulan dari semua kebijakan. Untuk informasi selengkapnya tentang membuat AWS IoT Core kebijakan, lihat [Kebijakan](https://docs.aws.amazon.com//iot/latest/developerguide/iot-policies.html).

`disconnectAfterInSeconds`  
Sebuah integer yang menentukan durasi maksimum (dalam detik) dari koneksi ke gateway. AWS IoT Core Nilai minimum adalah 300 detik, dan nilai maksimumnya adalah 86.400 detik. `disconnectAfterInSeconds`adalah untuk seumur hidup koneksi dan tidak disegarkan pada penyegaran kebijakan berturut-turut.

`refreshAfterInSeconds`  
Sebuah integer yang menentukan interval antara kebijakan refresh. Ketika interval ini berlalu, AWS IoT Core memanggil fungsi Lambda untuk memungkinkan penyegaran kebijakan. Nilai minimum adalah 300 detik, dan nilai maksimumnya adalah 86.400 detik.

### Contoh fungsi Lambda
<a name="custom-auth-509cert-js-example"></a>

Berikut ini adalah contoh fungsi Node.js Lambda. Fungsi ini memeriksa sertifikat X.509 klien dan mengekstrak informasi yang relevan seperti nomor seri, sidik jari, dan nama subjek. Jika informasi yang diekstraksi sesuai dengan nilai yang diharapkan, klien diberikan akses untuk terhubung. Mekanisme ini memastikan bahwa hanya klien yang berwenang dengan sertifikat yang valid yang dapat membuat koneksi.

```
const crypto = require('crypto');

exports.handler = async (event) => {
    
    // Extract the certificate PEM from the event
    const certPem = event.protocolData.tls.x509CertificatePem;
    
    // Parse the certificate using Node's crypto module
    const cert = new crypto.X509Certificate(certPem);
    
    var effect = "Deny";
    // Allow permissions only for a particular certificate serial, fingerprint, and subject
    if (cert.serialNumber === "7F8D2E4B9C1A5036DE8F7C4B2A91E5D80463BC9A1257" // This is a random serial
       && cert.fingerprint === "F2:9A:C4:1D:B5:E7:08:3F:6B:D0:4E:92:A7:C1:5B:8D:16:0F:E3:7A" // This is a random fingerprint
       && cert.subject === "allow.example.com") {
      effect = "Allow";
    }
    
    return generateAuthResponse(event.protocolData.tls.principalId, effect);
};


// Helper function to generate the authorization response.
function generateAuthResponse(principalId, effect) {
    const authResponse = {
        isAuthenticated: true,
        principalId,
        disconnectAfterInSeconds: 3600,
        refreshAfterInSeconds: 300,
        policyDocuments: [
          {
            Version: "2012-10-17",		 	 	 
            Statement: [
              {
                Action: ["iot:Connect"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:client/myClientName"
                ]
              },
              {
                Action: ["iot:Publish"],
                Effect: effect,
                Resource: [
                  "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Subscribe"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
                ]
              },
              {
                Action: ["iot:Receive"],
                Effect: effect,
                Resource: [
                   "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
                ]
              }
            ]
          }
        ]
      };

  return authResponse;
}
```

Fungsi Lambda sebelumnya mengembalikan JSON berikut ketika menerima sertifikat dengan serial, sidik jari, dan subjek yang diharapkan. Nilai `x509CertificatePem` akan menjadi sertifikat klien yang disediakan dalam jabat tangan TLS. Untuk informasi selengkapnya, lihat [Mendefinisikan fungsi Lambda Anda](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html#custom-auth-lambda).

```
{
	"isAuthenticated": true,
	"principalId": "principalId in the event JSON object",
	"policyDocuments": [
		{
			"Version": "2012-10-17",		 	 	 
			"Statement": [
				{
					"Action": "iot:Connect",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:client/myClientName"
				},
				{
					"Action": "iot:Publish",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				},
				{
					"Action": "iot:Subscribe",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topicfilter/telemetry/myClientName"
				},
				{
					"Action": "iot:Receive",
					"Effect": "Allow",
					"Resource": "arn:aws:iot:us-east-1:123456789012:topic/telemetry/myClientName"
				}
			]
		}
	],
	"disconnectAfterInSeconds": 3600,
	"refreshAfterInSeconds": 300
}
```

## Langkah 3: Buat otorisasi khusus
<a name="custom-auth-509cert-authorizer"></a>

Setelah [Anda menentukan fungsi Lambda](#custom-auth-509cert-lambda), buat otorisasi khusus untuk mengelola otentikasi klien dan logika otorisasi Anda sendiri. Anda dapat mengikuti petunjuk terperinci di [Langkah 3: Buat sumber otorisasi pelanggan dan otorisasi](https://docs.aws.amazon.com//iot/latest/developerguide/custom-auth-tutorial.html#custom-auth-tutorial-authorizer). Untuk informasi selengkapnya, lihat [Membuat otorisasi](https://docs.aws.amazon.com//iot/latest/developerguide/config-custom-auth.html). 

Dalam proses pembuatan otorisasi kustom, Anda harus memberikan AWS IoT izin untuk menjalankan fungsi Lambda setelah dibuat. Untuk petunjuk terperinci, lihat [Mengotorisasi AWS IoT untuk menjalankan fungsi Lambda](custom-auth-authorize.md) Anda.

## Langkah 4: Tetapkan jenis otentikasi dan protokol aplikasi dalam konfigurasi domain
<a name="custom-auth-509cert-domainconfig"></a>

Untuk mengautentikasi perangkat menggunakan otentikasi kustom dengan sertifikat klien X.509, Anda harus mengatur jenis otentikasi dan protokol aplikasi dalam konfigurasi domain, dan Anda harus mengirim ekstensi SNI. Nilai `authenticationType` harus`CUSTOM_AUTH_X509`, dan nilai `applicationProtocol` dapat menjadi `SECURE_MQTT` atau`HTTPS`.

### Mengatur jenis otentikasi dan protokol aplikasi dalam konfigurasi domain (CLI)
<a name="custom-auth-509cert-cli"></a>

Jika Anda tidak memiliki konfigurasi domain, gunakan [https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/create-domain-configuration.html)perintah untuk membuatnya. Nilai `authenticationType` harus`CUSTOM_AUTH_X509`, dan nilai `applicationProtocol` dapat menjadi `SECURE_MQTT` atau`HTTPS`.

```
aws iot create-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \ 
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

Jika Anda sudah memiliki konfigurasi domain, gunakan [https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html](https://docs.aws.amazon.com//cli/latest/reference/iot/update-domain-configuration.html)perintah update `authenticationType` dan `applicationProtocol` jika diperlukan. Perhatikan bahwa Anda tidak dapat mengubah jenis otentikasi atau protokol pada endpoint default ()`iot:Data-ATS`.

```
aws iot update-domain-configuration \
    --domain-configuration-name domainConfigurationName \
    --authentication-type CUSTOM_AUTH_X509 \  
    --application-protocol SECURE_MQTT \
    --authorizer-config '{
        "defaultAuthorizerName": my-custom-authorizer
    }'
```

`domain-configuration-name`  
Nama konfigurasi domain.

`authentication-type`  
Jenis otentikasi konfigurasi domain. Untuk informasi selengkapnya, lihat [memilih jenis autentikasi](protocols.md#connection-protocol-auth-mode).

`application-protocol`  
Protokol aplikasi yang digunakan perangkat untuk berkomunikasi AWS IoT Core. Untuk informasi selengkapnya, lihat [memilih protokol aplikasi](protocols.md#protocol-selection).

`--authorizer-config`  
Objek yang menentukan konfigurasi authorizer dalam konfigurasi domain.

`defaultAuthorizerName`  
Nama otorisasi untuk konfigurasi domain.

Untuk informasi selengkapnya, lihat [CreateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_CreateDomainConfiguration.html)dan [UpdateDomainConfiguration](https://docs.aws.amazon.com//iot/latest/apireference/API_UpdateDomainConfiguration.html)dari *Referensi AWS IoT API*. Untuk informasi selengkapnya tentang konfigurasi domain, lihat [Konfigurasi domain](https://docs.aws.amazon.com//iot/latest/developerguide/iot-custom-endpoints-configurable.html).

# Menghubungkan ke AWS IoT Core dengan menggunakan otentikasi kustom
<a name="custom-auth"></a>

 Perangkat dapat terhubung AWS IoT Core dengan menggunakan otentikasi khusus dengan protokol apa pun yang AWS IoT Core mendukung pesan perangkat. Untuk informasi selengkapnya tentang protokol komunikasi yang didukung, lihat. [Protokol komunikasi perangkat](protocols.md)  Data koneksi yang Anda berikan ke fungsi Lambda otorisasi Anda tergantung pada protokol yang Anda gunakan. Untuk informasi selengkapnya tentang membuat fungsi Lambda otorisasi Anda, lihat. [Mendefinisikan fungsi Lambda Anda](custom-auth-lambda.md) Bagian berikut menjelaskan cara menghubungkan untuk mengautentikasi dengan menggunakan setiap protokol yang didukung.

## HTTPS
<a name="custom-auth-http"></a>

Perangkat yang mengirim data AWS IoT Core dengan menggunakan [HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) dapat meneruskan kredensyal baik melalui header permintaan atau parameter kueri dalam permintaan HTTP POST mereka. Perangkat dapat menentukan otorisasi untuk dipanggil dengan menggunakan `x-amz-customauthorizer-name` header atau parameter kueri. Jika Anda mengaktifkan penandatanganan token di otorisasi, Anda harus meneruskan `token-key-name` dan `x-amz-customauthorizer-signature` dalam header permintaan atau parameter kueri. Perhatikan bahwa `token-signature` nilainya harus dikodekan URL saat menggunakan JavaScript dari dalam browser.

**catatan**  
Otorisasi pelanggan untuk protokol HTTPS hanya mendukung operasi publikasi. Untuk informasi selengkapnya tentang protokol HTTPS, lihat[Protokol komunikasi perangkat](protocols.md).

Contoh permintaan berikut menunjukkan bagaimana Anda meneruskan parameter ini di header permintaan dan parameter kueri. 

```
//Passing credentials via headers
POST /topics/topic?qos=qos HTTP/1.1
Host: your-endpoint 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
x-amz-customauthorizer-name: authorizer-name

//Passing credentials via query parameters
POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value HTTP/1.1
```

## MQTT
<a name="custom-auth-mqtt"></a>

 Perangkat yang terhubung AWS IoT Core dengan menggunakan koneksi MQTT dapat meneruskan kredensyal melalui `username` dan `password` bidang pesan MQTT. `username`Nilai juga dapat secara opsional berisi string kueri yang meneruskan nilai tambahan (termasuk token, tanda tangan, dan nama otorisasi) ke otorisasi Anda. Anda dapat menggunakan string kueri ini jika Anda ingin menggunakan skema otentikasi berbasis token, bukan dan nilai. `username` `password`  

**catatan**  
 Data di bidang kata sandi dikodekan oleh base64. AWS IoT Core Fungsi Lambda Anda harus memecahkan kode itu. 

 Contoh berikut berisi `username` string yang berisi parameter tambahan yang menentukan token dan tanda tangan.  

```
username?x-amz-customauthorizer-name=authorizer-name&x-amz-customauthorizer-signature=token-signature&token-key-name=token-value
```

Untuk memanggil otorisasi, perangkat yang terhubung AWS IoT Core dengan menggunakan MQTT dan otentikasi khusus harus terhubung pada port 443. Mereka juga harus melewati ekstensi Application Layer Protocol Negotiation (ALPN) TLS dengan nilai `mqtt` dan ekstensi Server Name Indication (SNI) dengan nama host dari endpoint data mereka. AWS IoT Core Untuk menghindari potensi kesalahan, nilai untuk `x-amz-customauthorizer-signature` harus dikodekan URL. Kami juga sangat merekomendasikan bahwa nilai-nilai `x-amz-customauthorizer-name` dan URL `token-key-name` dikodekan. Untuk informasi lebih lanjut tentang nilai-nilai ini, lihat[Protokol komunikasi perangkat](protocols.md). V2 [AWS IoT Klien Perangkat SDKs SDKs, Seluler, dan AWS IoT Perangkat](iot-sdks.md) dapat mengkonfigurasi kedua ekstensi ini. 

## MQTT lebih WebSockets
<a name="custom-auth-websockets"></a>

 Perangkat yang terhubung AWS IoT Core dengan menggunakan MQTT over WebSockets dapat meneruskan kredensyal dengan salah satu dari dua cara berikut. 
+ Melalui header permintaan atau parameter kueri dalam permintaan HTTP UPGRADE untuk membuat WebSockets koneksi.
+ Melalui `username` dan `password` bidang dalam pesan MQTT CONNECT.

 Jika Anda meneruskan kredensyal melalui pesan koneksi MQTT, ekstensi ALPN dan SNI TLS diperlukan. Untuk informasi selengkapnya tentang ekstensi ini, lihat[MQTT](#custom-auth-mqtt). Contoh berikut menunjukkan bagaimana untuk meneruskan kredensyal melalui permintaan HTTP Upgrade. 

```
GET /mqtt HTTP/1.1
Host: your-endpoint 
Upgrade: WebSocket 
Connection: Upgrade 
x-amz-customauthorizer-signature: token-signature
token-key-name: token-value 
sec-WebSocket-Key: any random base64 value 
sec-websocket-protocol: mqtt 
sec-WebSocket-Version: websocket version
```

## Menandatangani token
<a name="custom-auth-token-signature"></a>

Anda harus menandatangani token dengan kunci pribadi dari public-private key pair yang Anda gunakan dalam panggilan. `create-authorizer` Contoh berikut menunjukkan cara membuat tanda tangan token dengan menggunakan perintah Unix-like dan. JavaScript Mereka menggunakan algoritma hash SHA-256 untuk menyandikan tanda tangan.

------
#### [ Command line ]

```
echo -n TOKEN_VALUE | openssl dgst -sha256 -sign PEM encoded RSA private key | openssl base64
```

------
#### [ JavaScript ]

```
const crypto = require('crypto')

const key = "PEM encoded RSA private key"

const k = crypto.createPrivateKey(key)
let sign = crypto.createSign('SHA256')
sign.write(t)
sign.end()
const s = sign.sign(k, 'base64')
```

------

# Memecahkan masalah otorisasi Anda
<a name="custom-auth-troubleshooting"></a>

 Topik ini membahas masalah umum yang dapat menyebabkan masalah dalam alur kerja otentikasi khusus dan langkah-langkah untuk menyelesaikannya. **Untuk memecahkan masalah dengan paling efektif, aktifkan CloudWatch log untuk AWS IoT Core dan atur level log ke DEBUG.** Anda dapat mengaktifkan CloudWatch log di AWS IoT Core konsol ([https://console.aws.amazon.com/iot/](https://console.aws.amazon.com/iot/)). Untuk informasi selengkapnya tentang mengaktifkan dan mengonfigurasi log AWS IoT Core, lihat. [Konfigurasikan AWS IoT logging](configure-logging.md) 

**catatan**  
Jika Anda meninggalkan tingkat log di **DEBUG** untuk jangka waktu yang lama, CloudWatch mungkin menyimpan data logging dalam jumlah besar. Hal ini dapat meningkatkan CloudWatch biaya Anda. Pertimbangkan untuk menggunakan logging berbasis sumber daya untuk meningkatkan verbositas hanya untuk perangkat dalam grup hal tertentu. Untuk informasi selengkapnya tentang logging berbasis sumber daya, lihat. [Konfigurasikan AWS IoT logging](configure-logging.md) Selain itu, setelah Anda selesai memecahkan masalah, kurangi level log ke level yang kurang bertele-tele.

Sebelum Anda memulai pemecahan masalah, tinjau [Memahami alur kerja otentikasi kustom](custom-authorizer.md) tampilan tingkat tinggi dari proses otentikasi kustom. Ini membantu Anda memahami di mana mencari sumber masalah.

Topik ini membahas dua bidang berikut untuk Anda selidiki.
+ Masalah yang terkait dengan fungsi Lambda otorisasi Anda.
+ Masalah yang terkait dengan perangkat Anda.

## Periksa masalah dalam fungsi Lambda otorisasi Anda
<a name="custom-auth-troubleshooting-lambda"></a>

Lakukan langkah-langkah berikut untuk memastikan bahwa upaya koneksi perangkat Anda menjalankan fungsi Lambda Anda.

1. Verifikasi fungsi Lambda mana yang terkait dengan otorisasi Anda.

   Anda dapat melakukan ini dengan memanggil [DescribeAuthorizer](https://docs.aws.amazon.com/iot/latest/apireference/API_DescribeAuthorizer.html)API atau dengan mengklik otorisasi yang diinginkan di bagian **Aman** AWS IoT Core konsol.

1. Periksa metrik pemanggilan untuk fungsi Lambda. Lakukan langkah-langkah berikut untuk melakukan ini.

   1. Buka AWS Lambda konsol ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) dan pilih fungsi yang terkait dengan otorisasi Anda.

   1. Pilih tab **Monitor** dan lihat metrik untuk kerangka waktu yang relevan dengan masalah Anda.

1. Jika Anda tidak melihat pemanggilan, verifikasi bahwa AWS IoT Core memiliki izin untuk menjalankan fungsi Lambda Anda. Jika Anda melihat pemanggilan, lewati ke langkah berikutnya. Lakukan langkah-langkah berikut untuk memverifikasi bahwa fungsi Lambda Anda memiliki izin yang diperlukan.

   1. Pilih tab **Izin** untuk fungsi Anda di AWS Lambda konsol.

   1. Temukan bagian **Kebijakan Berbasis Sumber Daya** di bagian bawah halaman. Jika fungsi Lambda Anda memiliki izin yang diperlukan, kebijakan akan terlihat seperti contoh berikut.  
****  

      ```
      {
        "Version":"2012-10-17",		 	 	 
        "Id": "default",
        "Statement": [
          {
            "Sid": "Id123",
            "Effect": "Allow",
            "Principal": {
              "Service": "iot.amazonaws.com"
            },
            "Action": "lambda:InvokeFunction",
            "Resource": "arn:aws:lambda:us-east-1:111111111111:function:FunctionName",
            "Condition": {
              "ArnLike": {
                "AWS:SourceArn": "arn:aws:iot:us-east-1:111111111111:authorizer/AuthorizerName"
              },
              "StringEquals": {
                "AWS:SourceAccount": "111111111111"
              }
            }
          }
        ]
      }
      ```

   1. Kebijakan ini memberikan `InvokeFunction` izin atas fungsi Anda kepada AWS IoT Core kepala sekolah. Jika Anda tidak melihatnya, Anda harus menambahkannya dengan menggunakan [AddPermission](https://docs.aws.amazon.com/lambda/latest/dg/API_AddPermission.html)API. Contoh berikut menunjukkan kepada Anda bagaimana melakukan ini dengan menggunakan AWS CLI.

      ```
      aws lambda add-permission --function-name FunctionName --principal iot.amazonaws.com --source-arn AuthorizerARn --statement-id Id-123 --action "lambda:InvokeFunction"
      ```

1. Jika Anda melihat pemanggilan, verifikasi bahwa tidak ada kesalahan. Kesalahan mungkin menunjukkan bahwa fungsi Lambda tidak menangani peristiwa koneksi yang AWS IoT Core mengirimkannya dengan benar.

   Untuk informasi tentang penanganan acara di fungsi Lambda Anda, lihat. [Mendefinisikan fungsi Lambda Anda](custom-auth-lambda.md) Anda dapat menggunakan fitur pengujian di AWS Lambda console ([https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)) ke nilai pengujian kode keras dalam fungsi untuk memastikan bahwa fungsi tersebut menangani peristiwa dengan benar.

1. Jika Anda melihat pemanggilan tanpa kesalahan, tetapi perangkat Anda tidak dapat terhubung (atau memublikasikan, berlangganan, dan menerima pesan), masalahnya mungkin kebijakan yang ditampilkan oleh fungsi Lambda tidak memberikan izin untuk tindakan yang coba dilakukan perangkat Anda. Lakukan langkah-langkah berikut untuk menentukan apakah ada yang salah dengan kebijakan yang dikembalikan fungsi.

   1. Gunakan kueri Amazon CloudWatch Logs Insights untuk memindai log dalam waktu singkat untuk memeriksa kegagalan. Contoh kueri berikut mengurutkan peristiwa berdasarkan stempel waktu dan mencari kegagalan.

      ```
      display clientId, eventType, status, @timestamp | sort @timestamp desc | filter status = "Failure"    
      ```

   1. Perbarui fungsi Lambda Anda untuk mencatat data yang dikembalikan AWS IoT Core dan peristiwa yang memicu fungsi tersebut. Anda dapat menggunakan log ini untuk memeriksa kebijakan yang dibuat oleh fungsi tersebut.

1. Jika Anda melihat pemanggilan tanpa kesalahan, tetapi perangkat Anda tidak dapat terhubung (atau mempublikasikan, berlangganan, dan menerima pesan), alasan lain adalah fungsi Lambda Anda melebihi batas batas waktu. Batas waktu tunggu fungsi Lambda untuk otorisasi khusus adalah 5 detik. Anda dapat memeriksa durasi fungsi di CloudWatch log atau metrik. 

## Menyelidiki masalah perangkat
<a name="custom-auth-troubleshooting-investigate"></a>

Jika Anda tidak menemukan masalah dengan menjalankan fungsi Lambda Anda atau dengan kebijakan yang ditampilkan fungsi tersebut, cari masalah dengan upaya koneksi perangkat Anda. Permintaan koneksi yang salah dapat menyebabkan AWS IoT Core tidak memicu otorisasi Anda. Masalah koneksi dapat terjadi pada lapisan TLS dan aplikasi.

**Kemungkinan masalah lapisan TLS:**
+ Pelanggan harus meneruskan header nama host (HTTP, MQTT over WebSockets) atau ekstensi TLS Indikasi Nama Server (HTTP, MQTT over, MQTT) di WebSockets semua permintaan otentikasi kustom. Dalam kedua kasus tersebut, nilai yang diteruskan harus cocok dengan salah satu titik akhir AWS IoT Core data akun Anda. Ini adalah titik akhir yang dikembalikan ketika Anda melakukan perintah CLI berikut.
  + `aws iot describe-endpoint --endpoint-type iot:Data-ATS`
  + `aws iot describe-endpoint --endpoint-type iot:Data`(untuk titik VeriSign akhir warisan)
+ Perangkat yang menggunakan otentikasi khusus untuk koneksi MQTT juga harus melewati ekstensi TLS Application Layer Protocol Negotiation (ALPN) dengan nilai. `mqtt`
+ Otentikasi khusus saat ini hanya tersedia di port 443.

**Kemungkinan masalah lapisan aplikasi:**
+ Jika penandatanganan diaktifkan (`signingDisabled`bidangnya salah di otorisasi Anda), cari masalah tanda tangan berikut.
  + Pastikan Anda meneruskan tanda tangan token di `x-amz-customauthorizer-signature` header atau dalam parameter string kueri.
  + Pastikan layanan tidak menandatangani nilai selain token.
  + Pastikan Anda meneruskan token di header atau parameter kueri yang Anda tentukan di `token-key-name` bidang di otorisasi Anda.
+ Pastikan bahwa nama otorisasi yang Anda berikan di parameter `x-amz-customauthorizer-name` header atau string kueri valid atau Anda memiliki otorisasi default yang ditentukan untuk akun Anda.