У меня возникают проблемы с использованием временных учетных данных для инициирования подключения к 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 (пока!).