35

Amazon Web Services Internet of Things (AWS IoT) を使用して、Web ブラウザとの間でメッセージを送受信しようとしています (例: .AWS IoT が JavaScript をサポートしていることを考えると、これが可能であると予想されます...

AWS IoT ドキュメントを検索しましたが、サーバー側の例(AWS シークレット/キーを公開する...)しか見つかりませんでした。

AWS IoT を使用してブラウザで WebSockets/MQTT を介してメッセージを送受信するための適切な実例やチュートリアルはありますか(例: AWS Cognito による認証) ? ありがとう!

4

4 に答える 4

1

IAMここでポリシーとポリシーの違いを理解することは非常に重要AWS IOTです。cognito user poolID プロバイダーとしてを使用するとします。

最初に を設定しcognito identity pool、ID プールをリンクして、ロールをこの ID プールuser poolに割り当てる (IAMこのロールにポリシーをアタッチする) 必要があります。

次に、アプリで、最初にログインしてユーザー プールの資格情報を取得してから、

    AWS.config.credentials = new AWS.CognitoIdentityCredentials({
      IdentityPoolId: 'us-west-2:b8d2b32b-cbab-4ae3-9d47-1624d09c9350',
      Logins: {
        'cognito-idp.us-west-2.amazonaws.com/${userPoolIdentity}': userPoolCredential.getIdToken().getJwtToken(),
      }
    });

ユーザープール認証情報を aws 一時アクセス認証情報と交換するには:

    AWS.config.getCredentials(e => {
      if(e) console.log("Get credential failed", e);
      this.device = AwsIot.device({//AwsIot is the aws-iot-sdk package
        clientId: clientID,//clientId is just random string
        host: '*-ats.iot.us-west-2.amazonaws.com',//replace * with your own host
        protocol: 'wss',
        accessKeyId: AWS.config.credentials.accessKeyId,
        secretKey: AWS.config.credentials.secretAccessKey,
        sessionToken: AWS.config.credentials.sessionToken
      });
      this.device.on('connect', function() {
        console.log("DEVICE CONNECTED");
      });
      this.device.subscribe('test');
      this.device
      .on('message', function(topic, payload) {
        console.log(`TOPIC IS ${topic}\nMESSAGE IS ${payload.toString()}`);
      });
    });

しかし、上記のコードは機能しません!!! AWS IAMここで注意が必要な点があります。ユーザー プールの資格情報を交換して取得する資格情報は、ID プールにアタッチしたばかりのポリシーを表す一時的な資格情報にすぎません。IOT との接続をリクエストすると、AWS はリクエストが許可されているかどうか、およびユーザーがリクエストしたことを実行できるかどうかを確認します。すでにIAMポリシーを取得しているため、リクエストは許可されていますが、AWS IOTこの ID に関連付けられているポリシーがチェックされます。これを行っていないため、実際に要求したこと (つまり、接続) を行うことは許可されていません。そのため、初めて接続するときに、IOTこの ID にポリシーをアタッチする必要があります。これは、コマンドラインまたは

  (<AWS.CognitoIdentityCredentials>AWS.config.credentials).refresh(e => {
    if(e) console.log('error', e);
    const principal = (<AWS.CognitoIdentityCredentials>AWS.config.credentials).identityId;
    console.log(`IdentityId: ${principal}`);
    this.attachPrincipalPolicy("test-delete-after-use", principal);
  });
  attachPrincipalPolicy(policyName, principal) {
    new AWS.Iot().attachPrincipalPolicy({ 
      policyName: policyName, // you need to create policy beforehand in iot
      principal: principal 
    }, err => {
      err ? console.log('ATTACH PRINCIPAL POLICY ERROR', err) : console.log('ATTACH PRINCIPAL POLICY SUCCESS');
    });
  }

これで、ID が IOT に接続しようとすると、IOT はIOTこの ID に添付されたポリシーを見つけ、この接続を承認します。

言葉遣い悪くてすみません。IAM要約すると、ポリシーとポリシーの違いを明確にする必要がありますIOT。これは私が理解していることであり、間違った場所があるかもしれません。見つけたら、コメントを残すか、私の回答を編集してください。

重要 公式ドキュメントからこれら 2 つのポリシーの関係を見つけました: https://docs.aws.amazon.com/iot/latest/developerguide/pub-sub-policy.html HTTP および WebSocket クライアントのポリシーの セクションを参照してください。

于 2019-03-04T17:22:36.980 に答える