Amazon web services 具有STS临时凭据的Websocket上的AWS IoT MQTT

Amazon web services 具有STS临时凭据的Websocket上的AWS IoT MQTT,amazon-web-services,websocket,mqtt,aws-iot,Amazon Web Services,Websocket,Mqtt,Aws Iot,我在使用临时凭据启动与AWS IoT的连接时遇到问题,请使用STS临时凭据,同时确保安全 我已经使用带有策略的证书成功连接了嵌入式设备。 但当我尝试通过浏览器连接时,使用预先签名的URL,我遇到了一个绊脚石 下面是Lambda函数的代码片段,该函数首先验证请求(未显示),然后通过assumeRole使用STS凭据构建url 使用生成的URL和Paho javascript客户端,我已经成功地在浏览器中收到了“101交换协议”的响应。但是连接被终止,而不是切换到WebSocket 如果有人能给我提

我在使用临时凭据启动与AWS IoT的连接时遇到问题,请使用STS临时凭据,同时确保安全

我已经使用带有策略的证书成功连接了嵌入式设备。 但当我尝试通过浏览器连接时,使用预先签名的URL,我遇到了一个绊脚石

下面是Lambda函数的代码片段,该函数首先验证请求(未显示),然后通过assumeRole使用STS凭据构建url

使用生成的URL和Paho javascript客户端,我已经成功地在浏览器中收到了“101交换协议”的响应。但是连接被终止,而不是切换到WebSocket

如果有人能给我提供任何帮助或指导,我将不胜感激

const iot = new AWS.Iot();
const sts = new AWS.STS({region: 'eu-west-1'});
const params = {
    DurationSeconds: 3600,
    ExternalId: displayId,
    Policy: JSON.stringify(
        {
            "Version": "2012-10-17",
            "Statement": [
                {
                    "Effect": "Allow",
                    "Action": [
                        "iot:*"
                    ],
                    "Resource": [
                        "*"
                    ]
                },
                /*{
                    "Effect": "Allow",
                    "Action": [
                        "iot:Connect"
                    ],
                    "Resource": [
                        "arn:aws:iot:eu-west-1:ACCID:client/" + display._id
                    ]
                },
                {
                    "Effect": "Allow",
                    "Action": [
                        "iot:Receive"
                    ],
                    "Resource": [
                        "*"
                    ]
                }*/
            ]
        }
    ),
    RoleArn: "arn:aws:iam::ACCID:role/iot_websocket_url_role",
    RoleSessionName: displayId + '-' + Date.now()
};

sts.assumeRole(params, function(err, stsData) {
    if (err) {
        fail(err, db);
        return;
    }
    console.log(stsData);

    const AWS_IOT_ENDPOINT_HOST = 'REDACTED.iot.eu-west-1.amazonaws.com';

    var url = v4.createPresignedURL(
        'GET',
        AWS_IOT_ENDPOINT_HOST,
        '/mqtt',
        'iotdata',
        crypto.createHash('sha256').update('', 'utf8').digest('hex'),
        {
            key: stsData.Credentials.AccessKeyId,
            secret: stsData.Credentials.SecretAccessKey,
            protocol: 'wss',
            expires: 3600,
            region: 'eu-west-1'
        }
    );
    url += '&X-Amz-Security-Token=' + encodeURIComponent(stsData.Credentials.SessionToken);
    console.log(url);

    context.succeed({url: url});
});
编辑:如果有帮助的话,在选择返回101代码的请求后,我只是在Chrome调试器的“Frames”窗口中进行了检查。它显示单个帧:“二进制帧(操作码2,掩码)”


此操作码是否引用MQTT控制码2,即“CONNACK”?我不是MQTT的专家(还不是!)。

我通过阅读STS上的文档意识到了我的错误

如果将策略传递给此操作,则该操作返回的临时安全凭据具有所承担角色的访问策略和传递的策略所允许的权限

提供的角色学习还必须允许您通过STS assumeRole请求的操作

i、 e.RoleARN可以允许iot:*,然后当您担任角色时,您可以将权限缩小到iot:Connect和特定资源