繁体   English   中英

Cognito + IoT 集成 - 如何限制客户端,使其只能订阅名称为 Cognito 用户 ID 的 MQTT 主题?

[英]Cognito + IoT Integration - How to restrict a client so that it can subscribe to MQTT topic with name as Cognito user id only?

我正在寻找一种方法来向 AWS IoT 服务验证 Cognito 用户,以便用户可以订阅 MQTT 主题名称作为唯一的用户 ID(认知池的身份池)。 我知道使用两步过程可以实现。

我不知道我们需要将其附加到 Cognito 身份(又名用户)的特定策略,该策略必须限制用户将他/她的用户 ID 订阅为 MQTT 主题。 这意味着该应用程序无法订阅任何其他意外主题。

此外,策略需要是动态的(可能使用 ${cognito-identity.amazonaws.com:sub} 和条件)以简化开发

值得注意的是,用户可以同时登录多个移动应用实例(Android 和 iOS),如果用户同时登录 Android 和 iOS,那么两个应用实例应该能够订阅相同的主题(因为用户 ID 将保持不变对于同一用户)。

最后,我解决了。 分享解决方案,如果它可以帮助别人。 步骤如下:

  1. 我们需要将 IAM 策略附加到经过身份验证的用户的 Cognito 角色。 附加的策略必须允许操作——iot:Subscribe、iot:Connect、iot:Receive。 最终策略应如下所示。

     { "Version": "2012-10-17", "Statement": [ { "Sid": "Stmt1232909773123", "Action": [ "iot:Connect", "iot:Receive", "iot:Subscribe" ], "Effect": "Allow", "Resource": "*" } ] }
  2. 需要附加到身份 id(认知)的 IoT 策略应如下所示。

     { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "iot:Connect", "Resource": "arn:aws:iot:us-east-1:<account-number>:client/*" }, { "Effect": "Allow", "Action": [ "iot:Receive" ], "Resource": [ "arn:aws:iot:us-east-1:<account-number>:topic/${cognito-identity.amazonaws.com:sub}" ] }, { "Effect": "Allow", "Action": [ "iot:Subscribe" ], "Resource": [ "arn:aws:iot:us-east-1:<account-number>:topicfilter/${cognito-identity.amazonaws.com:sub}" ] } ] }

注意:对于 #2,您需要将您的 AWS 帐号放入策略中

在这个特定问题上花了很多时间。 MQTT IoT 策略中围绕变量替换的文档和错误处理不是很好。 以下内容也对我有用。 如果您使用 Cognito 联合身份,请确保将 IoT 策略添加到经过身份验证的用户角色。 最后说明: ${cognito-identity.amazonaws.com:sub}解析为来自 Cognito 开发者身份的identityId ,而不是用户池或 JWT。 无论如何,希望这对其他人有所帮助。

Cognito Authenticated Role Policy注意:这太宽松了 - 根据需要进行改进。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "iot:*"
            ],
            "Effect": "Allow",
            "Resource": "*"
        }
    ]
}

MQTT 物联网政策:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "iot:Connect",
      "Resource": "arn:aws:iot:us-east-1:<account-id>:client/*"
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Publish",
        "iot:Receive"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:<account-id>:topic/${cognito-identity.amazonaws.com:sub}/*"
      ]
    },
    {
      "Effect": "Allow",
      "Action": [
        "iot:Subscribe"
      ],
      "Resource": [
        "arn:aws:iot:us-east-1:<account-id>:topicfilter/${cognito-identity.amazonaws.com:sub}/*"
      ]
    }
  ]
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM