

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# AWS IoT Core 使用自訂身分驗證連線至
<a name="custom-auth"></a>

 裝置可以使用 AWS IoT Core 自訂身分驗證搭配 AWS IoT Core 支援裝置傳訊的任何通訊協定來連線至 。如需受支援通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。  傳遞至授權方 Lambda 函數的連線資料取決於您使用的通訊協定。如需建立授權方 Lambda 函數的詳細資訊，請參閱 [定義您的 Lambda 函式](custom-auth-lambda.md)。以下各節說明如何使用每個支援的通訊協定來連線，以便進行身分驗證。

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

 AWS IoT Core 使用 [HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) 將資料傳送到 的裝置，可以透過請求標頭或查詢其 HTTP POST 請求中的參數來傳遞憑證。裝置可以指定要使用 `x-amz-customauthorizer-name` 標頭或查詢參數叫用的授權方。如果您已在授權方中啟用字符簽署，則必須在請求標頭或查詢參數中傳遞 `token-key-name` 和 `x-amz-customauthorizer-signature`。請注意，在瀏覽器中使用 JavaScript 時，`token-signature` 的值必須是 URL 編碼格式。

**注意**  
HTTPS 通訊協定的客戶授權方僅支援發佈操作。如需有關 HTTP 通訊協定的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。

下列範例請求會顯示如何在請求標頭和查詢參數中傳遞這些參數。

```
//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>

 AWS IoT Core 使用 MQTT 連線連線至 的裝置可以透過 MQTT 訊息的 `username`和 `password` 欄位傳遞登入資料。此 `username` 值也可以選擇包含一個查詢字串，將其他值 (包括字符、簽章和授權方名稱) 傳遞給您的授權方。如果您想要使用字符型身分驗證結構描述，而不是 `username` 和 `password` 值，則可使用此查詢字串。  

**注意**  
 密碼欄位中的資料由 base64 編碼 AWS IoT Core。您的 Lambda 函數必須將其解碼。

 以下範例包含一個 `username` 字串，其中包含指定字符和簽章的額外參數。  

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

若要叫用 授權方， AWS IoT Core 使用 MQTT 和自訂身分驗證連線至 的裝置必須在連接埠 443 上連線。他們也必須傳遞值為 的應用程式層通訊協定交涉 (ALPN) TLS 延伸，`mqtt`以及其 AWS IoT Core 資料端點主機名稱的伺服器名稱指示 (SNI) 延伸。為了避免潛在的錯誤，`x-amz-customauthorizer-signature` 的值必須進行 URL 編碼。我們也強烈建議您對 `x-amz-customauthorizer-name` 和 `token-key-name` 值進行 URL 編碼。如需這些值的詳細資訊，請參閱 [裝置通訊協定](protocols.md)。V2 [AWS IoT 裝置SDKs、行動SDKs和 AWS IoT 裝置用戶端](iot-sdks.md) 可以設定這些延伸模組。 

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

 AWS IoT Core 透過 WebSockets 使用 MQTT 連線至 的裝置可以透過下列兩種方式之一傳遞登入資料。
+ 透過 HTTP UPGRADE 請求中的請求標頭或查詢參數來建立 WebSockets 連線。
+ 透過 MQTT CONNECT 訊息中的 `username` 和 `password` 欄位。

 如果透過 MQTT CONNECT 訊息傳遞憑證，則需要 ALPN 和 SNI TLS 延伸。如需這些延伸的詳細資訊，請參閱 [MQTT](#custom-auth-mqtt)。下列範例顯示如何透過 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
```

## 簽署字符
<a name="custom-auth-token-signature"></a>

您必須利用您在 `create-authorizer` 呼叫中所使用之公有/私有金鑰對中的私有金鑰簽署字符。下列範例顯示如何使用類似 UNIX 的命令和 JavaScript 來建立字符簽章。它們會使用 SHA-256 雜湊演算法來編碼簽章。

------
#### [ 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')
```

------