对于未经身份验证的认知身份,“身份池已身份验证”角色足以允许连接到 IoT MQTT 代理。但是,对于经过身份验证的 cognito 身份,需要两件事:
“身份池已验证”角色必须允许访问您需要的 IoT 操作(例如连接、发布等)。
您必须使用AttachPrincipalPolicy API将 IoT 策略(与附加到设备的策略完全相同)附加到认知身份
第 2 步是我今天早些时候被卡住的地方,因为在任何地方都不是特别清楚需要这样做。
AFAIK 无法从任何 AWS 网站将 IoT 策略附加到认知用户。但是,如果您在机器上设置了 AWS 命令行界面,则可以从那里进行设置。该命令如下所示:
aws iot attach-principal-policy --policy-name <iot-policy-name> --principal <cognito-identity-id>
可以使用 找到 cognito 身份 ID,Federated Identities > Your Pool > Identity browser
或者您也可以在对CognitoIdentityCredentials.get
呼叫的响应中找到它。看起来像这样us-east-1:ba7cef62-f3eb-5be2-87e5-fffbdeed2824
对于生产系统,您显然希望自动附加此策略,可能在用户注册时使用 lambda 函数。
可以在此页面上找到有关需要附加 IoT 策略的文档部分:
要使经过身份验证的 Amazon Cognito 身份通过 HTTP 在您的 AWS 账户中的 topic1 上发布 MQTT 消息,您必须指定两个策略,如此处所述。第一个策略必须附加到 Amazon Cognito 身份池角色并允许该池中的身份进行发布调用。第二个策略使用 AWS IoT AttachPrincipalPolicy API 附加到 Amazon Cognito 用户,并允许指定的 Amazon Cognito 用户访问 topic1 主题。