

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# カスタム認証 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>

[HTTP Publish API](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) を使用して AWS IoT Core にデータを送信するデバイスは、HTTP POST リクエストのリクエストヘッダーまたはクエリパラメータを介して認証情報を渡すことができます。デバイスは、`x-amz-customauthorizer-name` ヘッダーまたはクエリパラメータを使用して呼び出すオーソライザーを指定できます。オーソライザーでトークン署名を有効にしている場合は、リクエストヘッダーまたはクエリパラメータで `token-key-name` と `x-amz-customauthorizer-signature` を渡す必要があります。ブラウザ内から JavaScript を使用する場合、`token-signature` の値は URL エンコードする必要があります。

**注記**  
HTTPS プロトコルのカスタマーオーソライザーは、発行オペレーションのみをサポートします。HTTPS プロトコルの詳細については、「[デバイス通信プロトコル](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>

 MQTT 接続 AWS IoT Core を使用して に接続するデバイスは、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
```

オーソライザーを呼び出すには、MQTT とカスタム認証 AWS IoT Core を使用して に接続するデバイスがポート 443 に接続する必要があります。また、 の値を持つ Application Layer Protocol Negotiation (ALPN) TLS 拡張機能`mqtt`と、 AWS IoT Core データエンドポイントのホスト名を持つ Server Name Indication (SNI) 拡張機能を渡す必要があります。潜在的なエラーを回避するために、`x-amz-customauthorizer-signature` の値は URL エンコードされている必要があります。また、`x-amz-customauthorizer-name` と `token-key-name` の値も URL エンコードすることを強くお勧めします。これらの値の詳細については、「[デバイス通信プロトコル](protocols.md)」を参照してください。V2 [AWS IoT Device SDK、Mobile SDK、および AWS IoT Device Client](iot-sdks.md) は、これらの拡張の両方を設定できます。 

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

 MQTT over WebSockets AWS IoT Core を使用して に接続するデバイスは、次の 2 つの方法のいずれかで認証情報を渡すことができます。
+ HTTP UPGRADE リクエストのリクエストヘッダーまたはクエリパラメータを介して、WebSocket 接続を確立します。
+ MQTT CONNECT メッセージの `username` フィールドと `password` フィールド経由。

 MQTT 接続メッセージを介して認証情報を渡す場合、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')
```

------