

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用自定义身份验证 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 发布 API 向 AWS IoT Core 其发送数据的设备可以在其 HTTP P](https://docs.aws.amazon.com/iot/latest/apireference/API_iotdata_Publish.html) OST 请求中通过请求标头或查询参数传递凭证。设备可以使用 `x-amz-customauthorizer-name` 标头或查询参数指定要调用的授权方。如果您在授权方中启用了令牌签名，则必须使用请求标头或查询参数传递 `token-key-name` 和 `x-amz-customauthorizer-signature`。请注意，在`token-signature`浏览器中使用 JavaScript 该值时必须经过网址编码。

**注意**  
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 连接连接的设备可以通过 MQTT 消息的`username`和`password`字段传递凭证。 AWS IoT Core `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 进行连接。它们还必须通过应用层协议协商 (ALPN) TLS 扩展（值为）`mqtt`和服务器名称指示 (SNI) 扩展名及其 AWS IoT Core 数据端点的主机名。为避免潜在的错误，`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 结束了 WebSockets
<a name="custom-auth-websockets"></a>

 使用 MQTT 连接的设备 WebSockets 可以通过以下两种方式之一传递证书。 AWS IoT Core 
+ 通过 HTTP UPGRADE 请求中的请求标头或查询参数来建立 WebSockets 连接。
+ 通过 `username` 和 `password` 字段中的 MQTT CONNECT 消息。

 如果您通过 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')
```

------