AWS IoT
开发人员指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

自定义授权方工作流

对于要使用自定义授权方针对 AWS IoT 设备网关进行身份验证的设备,在调用授权方之前,需要通过由 AWS 使用的令牌和签名来验证令牌。

当设备尝试连接到 AWS IoT 时,它会在 HTTP 标头中发送以下信息:

  • 身份验证服务所生成的令牌。

  • 身份验证服务所生成的签名。

  • 用于对令牌进行身份验证的授权方。如果忽略,则将使用默认授权方。

以下是通过 WebSocket 协议连接到 AWS IoT 的示例 HTTP 请求。

GET /mqtt HTTP/1.1 Host: <your-iot-endpoint> Upgrade: WebSocket Connection: Upgrade x-amz-customauthorizer-name: <authorizer-name> 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>

在此示例中,x-amz-customauthorizer-name 标头指定要使用的自定义授权方,x-amz-customauthorizer-signature 标头包含用于验证令牌的数字签名,token-key-name 是由传递给 create-authorizer API 的 --token-key-name 指定的令牌密钥名称。

注意

某些 Web 浏览器可能不支持自定义 HTTP 标头。

AWS IoT 设备网关将验证数字签名,如果签名有效,将调用指定的授权方。以下是 AWS IoT 发送到自定义授权方的 Lambda 函数的示例负载。

{ "token": "some-token" }

授权方验证令牌并返回委托人 ID、其关联的 AWS IoT/IAM 策略以及连接的生存时间 (TTL) 信息。

以下是来自自定义授权方的响应的示例。

{ "isAuthenticated":true, "principalId": "xxxxxxxx", "disconnectAfterInSeconds": 86400, "refreshAfterInSeconds", 300, "policyDocuments": [ "{ \"Version\": \"2012-10-17\", \"Statement\": [ { \"Action\": \"...\", \"Effect\": \"Allow|Deny\", \"Resource\": \"...\" } ] }" ] }

Lambda 函数的返回值应类似于上述内容,并且可以是 JSON 序列化或非序列化对象。

随后,AWS IoT 设备网关将建立 WebSocket 连接。AWS IoT 将缓存与委托人关联的策略,以便无需重新对设备进行身份验证即可对后续调用进行授权。自定义身份验证期间发生的任何失败都会导致身份验证失败和连接终止。

有关此工作流程的端到端示例,请参阅如何使用您自己的身份和权限管理系统来控制对 AWS IoT 资源的访问