18

ブラウザから Web ソケットを使用して AWS IoT に接続しようとしています。

この例を試しました: https://github.com/awslabs/aws-iot-examples/tree/master/mqttSample

もう 1 つは、Cognito ID プールにログインしているユーザーで使用できるように少し変更されています。 https://github.com/dwyl/learn-aws-iot/blob/master/src/js/utils/request.js#L27

有効な IoT ポリシーを持つ IAM ユーザーを使用すると正常に接続できますが、ユーザー資格情報を使用すると、「101 Switching Protocols」応答を受け取りますが、閉じられます。

認証されたユーザーに関連付けられた IAM ロールは正しく、リクエストに署名し、APIG エンドポイントの呼び出しなどの他のプライベート オペレーションを実行できます。また、ソケット接続は 403 で応答しません。したがって、パーミッションの問題ではない可能性があります。

他に何がありますか?

4

6 に答える 6

20

認証されていない Cognito ID の場合、IoT MQTT ブローカーへの接続を許可するには、「認証済みの ID プール」ロールで十分です。ただし、認証されたコグニト ID には、次の 2 つが必要です。

  1. 「ID プール認証済み」ロールは、必要な IoT アクション (接続、公開など) へのアクセスを許可する必要があります。

  2. AttachPrincipalPolicy APIを使用して、IoT ポリシー (デバイスにアタッチされているものとまったく同じ) を cognito ID にアタッチする必要があります。

ステップ 2 は、これが必要な場所が特に明確ではなかったので、今日私が立ち往生した場所です。

私の知る限り、AWS Web サイトから IoT ポリシーを cognito ユーザーにアタッチする方法はありません。ただし、マシンに AWS コマンド ライン インターフェイスがセットアップされている場合は、そこから実行できます。コマンドは次のようになります。

aws iot attach-principal-policy --policy-name <iot-policy-name> --principal <cognito-identity-id>

Cognito ID は を使用してFederated Identities > Your Pool > Identity browser見つけることができます。また、呼び出しへの応答でも見つけることができますCognitoIdentityCredentials.get。このように見えますus-east-1:ba7cef62-f3eb-5be2-87e5-fffbdeed2824

運用システムの場合、おそらくユーザー サインアップでラムダ関数を使用して、このポリシーのアタッチを自動化したいことは明らかです。

IoT ポリシーを添付する必要性について説明しているドキュメントのセクションは、次のページにあります。

認証された Amazon Cognito ID が AWS アカウントの topic1 で HTTP 経由で MQTT メッセージを発行するには、ここで概説するように 2 つのポリシーを指定する必要があります。最初のポリシーは、Amazon Cognito ID プール ロールにアタッチし、そのプールの ID がパブリッシュ コールを実行できるようにする必要があります。2 番目のポリシーは、AWS IoT AttachPrincipalPolicy API を使用して Amazon Cognito ユーザーにアタッチされ、指定された Amazon Cognito ユーザーが topic1 トピックにアクセスできるようにします。

于 2016-10-28T13:14:34.583 に答える
7

カレブの回答をフロントエンドに実装するには、いくつかのことを行う必要がありました。

  1. AWSIoTDataAccess[IoT コンソール] > [セキュリティ] > [ポリシー] に移動し、ポリシーの内容をコピーして貼り付けて、IoT ポリシー (「デフォルト」という名前) を作成します。
  2. 次のインライン ポリシーを Cognito ID プールの認証済みロールに追加します。{"Effect": "Allow", "Action": ["iot:AttachPrincipalPolicy"], "Resource": ["*"]

次に、フロントエンド コードを次のように更新しました。

AWS.config.region = process.env.AWS_REGION;
AWS.config.credentials = new AWS.CognitoIdentityCredentials({
  IdentityPoolId: process.env.AWS_IDENTITY_POOL,
  Logins: {
    'graph.facebook.com': FACEBOOK_ACCESS_TOKEN
  }
});
AWS.config.credentials.get(() => {
  const IoT = new AWS.Iot();
  IoT.attachPrincipalPolicy({
    policyName: 'default',
    principal: AWS.config.credentials.identityId
  }, (err, res) => {
    if (err) console.error(err);
    // Connect to AWS IoT MQTT
  });
});
于 2017-01-11T16:43:28.207 に答える
5

IoT ポリシーを Lambda (NodeJS) 関数から Cognito ユーザー ID にアタッチするコード サンプルを次に示します。

function attachPrincipalPolicy(device_id, cognito_user_id) {
    const iotMgmt = new AWS.Iot();
    return new Promise(function(resolve, reject) {
        let params = {
            policyName: device_id + '_policy',
            principal: cognito_user_id
        };
        console.log("Attaching IoT policy to Cognito principal")
        iotMgmt.attachPrincipalPolicy(params, (err, res) => {
            if (err) {
                console.error(err);
                reject(err);
            } else {
                resolve();
            }
        });
    });
}
于 2016-12-06T10:32:03.807 に答える