使用自定义身份验证连接到 Amazon IoT Core - Amazon IoT Core
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

使用自定义身份验证连接到 Amazon IoT Core

设备可以借助任何 Amazon IoT Core 支持进行设备消息收发的协议,使用自定义身份验证连接到 Amazon IoT Core 。有关受支持的通信协议的更多信息,请参阅 设备通信协议。  您传递给授权方 Lambda 函数的连接数据取决于您使用的协议。有关创建授权方 Lambda 函数的更多信息,请参阅 定义您的 Lambda 函数。以下部分说明如何使用每个支持的协议连接到身份验证。

HTTP

使用 HTTP Publish API 将数据发送给 Amazon IoT Core 的设备可以通过请求标头或 HTTP POST 请求中的查询参数传递凭证。设备可以使用 x-amz-customauthorizer-name 标头或查询参数指定要调用的授权方。如果您在授权方中启用了令牌签名,则必须使用请求标头或查询参数传递 token-key-namex-amz-customauthorizer-signature。以下示例请求显示了如何使用请求标头和查询参数传递这些参数。

//Passing credentials via headers POST /topics/topic?qos=qos HTTP/1.1 Host: your-endpoint  x-amz-customauthorizer-signature: token-signature token-key-name: some-token  x-amz-customauthorizer-name: <authorizer-name> //Passing credentials via query parameters POST /topics/topic?qos=qos&x-amz-customauthorizer-signature=${sign}&token-name=${token-value} HTTP/1.1

MQTT

使用 MQTT 连接连接到 Amazon IoT Core 的设备可以通过 MQTT 消息中的 usernamepassword 字段传递凭证。username 值可以选择将其他值(包括令牌、签名和授权方名称)传递给授权方的查询字符串包含在内。  如果要使用基于令牌的身份验证方案而不是 usernamepassword 值,则可以使用此查询字符串。 

注意

密码字段中的数据由 Amazon IoT Core 进行 base64 编码。您的 Lambda 函数必须对其进行解码。

以下示例包含一个 username 字符串,其中带有指定令牌和签名的额外参数。 

username?x-amz-customauthorizer-name=${name}&x-amz-customauthorizer-signature=${sign}&token-name=${token-value}

为了调用授权方,使用 MQTT 连接到 Amazon IoT Core 的设备和自定义身份验证必须连接端口 443。它们还必须传递带有值 mqtt 的应用程序层协议协商 (ALPN) TLS 扩展和带有其 Amazon IoT Core 数据端点的服务器名称指示 (SNI) 扩展。有关这些值的更多信息,请参阅 设备通信协议。  V2 Amazon IoT 设备软件开发工具包、移动软件开发工具包和 Amazon IoT Device Client 可以配置这两个扩展。   

通过 WebSockets 的 MQTT

使用通过 WebSockets 的 MQTT 连接到 Amazon IoT Core 的设备可以通过以下两种方式之一传递凭证。

  • 通过 HTTP UPGRADE 请求中的请求标头或查询参数建立 WebSockets 连接。

  • 通过 usernamepassword 字段中的 MQTT CONNECT 消息。

如果您通过 MQTT 连接消息传递凭证,则需要使用 ALPN 和 SNI TLS 扩展。有关这些扩展的更多信息,请参阅 MQTT。以下示例演示如何通过 HTTP Upgrade 请求传递凭证。

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

签名令牌

必须使用 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')