AWS IoT: ForbiddenException: запрещено при попытке iotData.getThingShadow() в браузере

Я работаю над скриптом браузера, загруженным в EC2 для getThingShadow() с использованием учетных данных Federated Cognito (вход через Facebook), но получаю только ForbiddenException: Forbidden

часть входа прошла успешно, я получил учетные данные (не пустые) от AWS.WebIdentityCredentials()

Идентификатор cognito был авторизован вручную с помощью интерфейса командной строки (aws iot attach-principal-policy). Cognito_Auth_Rule также разрешал iot:*

вроде все сделал как по инструкции, все равно не могу получить iotData

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/IotData.html

Пожалуйста, дайте совет, очень ценю любые комментарии

Спасибо

Ник

Моя IAM-политика, прикрепленная к Cognito_Auth_Rule:

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

получить учетные данные

iotData.config.credentials = new AWS.WebIdentityCredentials({
    ProviderId: 'graph.facebook.com',
    RoleArn: roleArn,
    WebIdentityToken: response.authResponse.accessToken
});

мой код

        var params = {
            thingName: 'thingName' /* required */
        };
        iotdata.getThingShadow(params, function (err, data) {
            if (err) {
                console.log(err, err.stack); // an error occurred
                iotResults.innerHTML = err;
            } else {
                console.log(data);           // successful response
                iotResults.innerHTML = data;
            }
        });

сообщение об ошибке из консоли:

Error: Forbidden
    at Object.s [as extractError] (aws-sdk-2.7.20.min.js:37)
    at constructor.i (aws-sdk-2.7.20.min.js:37)
    at constructor.callListeners (aws-sdk-2.7.20.min.js:38)
    at constructor.emit (aws-sdk-2.7.20.min.js:38)
    at constructor.emitEvent (aws-sdk-2.7.20.min.js:37)
    at constructor.e (aws-sdk-2.7.20.min.js:37)
    at a.runTo (aws-sdk-2.7.20.min.js:39)
    at aws-sdk-2.7.20.min.js:39
    at constructor.<anonymous> (aws-sdk-2.7.20.min.js:37)
    at constructor.<anonymous> (aws-sdk-2.7.20.min.js:37) "ForbiddenException: Forbidden
    at Object.s [as extractError] (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:9704)
    at constructor.i (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:14284)
    at constructor.callListeners (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:38:4687)
    at constructor.emit (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:38:4396)
    at constructor.emitEvent (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:23801)
    at constructor.e (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:19651)
    at a.runTo (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:39:11367)
    at https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:39:11574
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:19861)
    at constructor.<anonymous> (https://sdk.amazonaws.com/js/aws-sdk-2.7.20.min.js:37:23856)"

person Nick    schedule 20.05.2017    source источник


Ответы (2)


политика IAM в порядке... но вам нужно специально установить политику IoT для этого пользователя... поэтому, когда пользователь будет создан, или сейчас, когда пользователь входит в систему... вызовите

let iot = new AWS.Iot(); iot.attachPrincipalPolicy(

вы должны заметить, что метод получил имя политики, то есть имя политики «в политиках IoT» (не в политиках IAM, поэтому скопируйте свою политику в IoT), и принципал, то есть идентификатор пользователя cognito.

недостаточно указать IAM-политику, нужно указать и attachPrincipalPolicy

person UXDart    schedule 20.05.2017
comment
теперь вы должны попробовать с этой политикой, которая разрешает все... но позже измените ее на что-то более конкретное - person UXDart; 20.05.2017
comment
оказалось, я не могу iot.attachPrincipalPolicy из скрипта браузера, но я подключаю cognitoID к политике через веб-консоль IoT, и это работает! спасибо за предложения - person Nick; 21.05.2017
comment
attach... - это вызов сервера, потому что если бы никто не мог разрешить в политике все, что захочет - person UXDart; 21.05.2017
comment
большое спасибо. наконец удалось получить теневые данные, вручную прикрепив CognitoID к политике IoT в веб-консоли. Как прикрепить через скрипт? Я не могу заставить работать iot.attachPrincipalPolicy()... большое спасибо. - person David; 25.10.2017

Чтобы прочитать тень вещи через браузер с использованием метода iotdata.getThingShadow();, как использует OP, вам необходимо прикрепить основную политику.

Если кому-то интересно, как автоматически настроить iot.attachPrincipalPolicy, о котором упоминал UXDart:

 cognitoIdentity.getId(params, function(err, data) {
        if (err) console.log(err, err.stack); // an error occurred
        else{
          cognitoId = data.IdentityId;

          console.log('Cognito ID: ' + cognitoId);

          var iot = new AWS.Iot();

          iot.listPrincipalPolicies({principal: cognitoId}, function(err, data) {
            if (err) console.log(err, err.stack); // an error occurred
            else{
              console.log(data);
              var found = false;
              for(var i = 0; i < data.policies.length; i++) {
                if (data.policies[i].policyName == 'your-iot-policy'){
                  found = true;
                  break;
                }
              }
              if(found == false){
                console.log("Versuche Policy einzutragen...")
                iot.attachPrincipalPolicy({policyName: 'your-iot-policy', principal: cognitoId}, function(err, data) {
                  if (err) console.log(err, err.stack); // an error occurred
                  else     console.log("Policy eingetragen!");           // successful response
                });
              }else console.log("Policy gefunden!");
            }
          });
        }
      });
person David    schedule 25.10.2017