AWS IoT MQTT через Websocket с временными учетными данными STS

У меня возникают проблемы с использованием временных учетных данных для инициирования подключения к AWS IoT с использованием временных учетных данных STS, сохраняя при этом безопасность.

Я уже успешно подключал встроенные устройства, используя сертификаты с политиками. Но когда я пытаюсь подключиться через браузер, используя предварительно подписанный URL-адрес, я наткнулся на камень преткновения.

Ниже приведен фрагмент кода из лямбда-функции, которая сначала аутентифицирует запрос (не показан), а затем создает URL-адрес с использованием учетных данных STS с помощью acceptRole.

Используя сгенерированный мной URL-адрес вместе с клиентом Paho javascript, я добился успеха до момента, когда получил ответ «101 протокол переключения» в браузере. Но соединение разрывается вместо переключения на веб-сокеты.

Любая помощь или руководство, которые кто-либо может мне предоставить, были бы очень признательны.

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});
});

Изменить: если это помогает, я просто проверил внутри окна «Фреймы» в отладчике Chrome после выбора запроса, который возвращает код 101. Он показывает один кадр: «Двоичный кадр (код операции 2, маска)».

Относится ли этот код операции к контрольному коду 2 MQTT AKA "CONNACK"? Я не эксперт в MQTT (пока!).


person edje    schedule 03.03.2017    source источник


Ответы (1)


Свою ошибку я осознал, прочитав документацию на СТС.

Если вы передаете политику этой операции, временные учетные данные безопасности, возвращаемые операцией, имеют разрешения, которые разрешены как политикой доступа предполагаемой роли, так и политикой, которую вы передаете.

Предоставляемый RoleARN также должен разрешать действия, которые вы запрашиваете через STS acceptRole.

то есть RoleARN может разрешить iot: *, тогда, когда вы берете на себя роль, вы можете сузить разрешения, например, до iot: Connect и для определенных ресурсов.

person edje    schedule 24.03.2017