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 指定的令牌密钥名称。

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

{ "type":"TOKEN", "authorizationToken":"<caller-supplied-token>", "authorizerId":<authorizer-id>, "endpoint":"<your-iot-endpoint>" }

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

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

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

(您的 Lambda 函数应按原样 (非序列化) 返回上述响应。Lambda 函数将为您对其进行序列化。)

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